终于开始刷题了!

本来计划这学期开学就开始刷LeetCode的,无奈拖延症严重,一直到校历第八周才正式开始刷题。以后计划每天做1~2道题吧,然后每周末写个总结回顾,也相当于是学习笔记了。
本来是想顺着序号写简单题的,看了知乎发现大家推荐先做top 100 liked,所以就先刷这个list上的简单题了。4.15~4.20做了四道题(two sum/reverse integer/valid parentheses/merge two sorted list),每一道题都能学到很多新知识啊,我是真的菜。
1、two sum
这道题用了map,是一个包含key和value的容器,key和value一一对应。
题目的思路大概是,从nums的第一个元素开始,判断它是否在map中,若不在就将target-nums[i]和i存在map中,然后判断下一个元素,直到map中含有这个元素,就将map中对应的key和此时的i输出。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        map<int, int>store;
        for (int i = 0; i != nums.size(); ++i)
        {
        if (store.find(nums[i]) == store.end())
        store[target - nums[i]] = i;
        else
        return{ store[nums[i]],i };
        }
        return{};
        }
};

其实我在写这道题的时候都不会调用成员函数,连.find和.end都不会用,实在是尴尬,一点一点学吧!

2、reverse integer
这道题没有用什么特殊的用法,就是取余一位一位取出来,然后再乘十加余数,就达到了反转的目的。

class Solution {
public:
    int reverse(int x) {
        int pop=0;
        int res=0;
        while(x!=0)
        {
            pop=x%10;
            x=x/10;
            if(res>INT_MAX/10||(res==INT_MAX/10&&pop>7))
                return 0;
            if(res<INT_MIN/10||(res==INT_MIN/10&&pop<-8))
                return 0;
            res=res*10+pop;
            
        }
        return res;
    }
};

但是这里用到了INT_MAX,一开始很不理解这个为什么没给它赋值就可以用(我刚开始写的时候加的判断都是给出了具体的值。。),后来才知道是int型数据能表示的最大值。ps:这个判断过程还是很巧妙的。

3、valid parentheses
这个题目是判断括号的使用是否符合规范,又学到了栈stack的用法,大致了解了stack的成员函数,因为只能从栈顶操作,所以也没有pop_back这种,直接pop,push即可。switch的用法还是比较熟悉的。

class Solution {
public:
    bool isValid(string s) {
        stack<char> paren;
        for(char&c:s)
            switch(c)
            {
                    case'(':
                    case'[':
                    case'{':paren.push(c);break;
                    case')':
                    if(paren.empty()||paren.top()!='(')
                        return false;
                    else
                        paren.pop();
                    break;
                    case']':
                    if(paren.empty()||paren.top()!='[')
                        return false;
                    else
                        paren.pop();
                    break;
                    case'}':
                    if(paren.empty()||paren.top()!='{')
                        return false;
                    else
                        paren.pop();
                    break;
                    default: ; // pass
            }
        return paren.empty();
    }
};

4、merge two sorted list
这道题目是考察singly-linked list的用法,虽然开头给出了单链表的定义但我还是没有看懂 /笑哭,还是各种查资料,才大概明白这个list类到底应该怎么用,以及类对象定义为指针时,访问成员函数要用“->”,而不是用“.”。第一种方法还使用了递归,让我这个啥也不懂的人觉得,哇好厉害,原来这个也可以递归,太妙了!第二种方法,还不太理解dummy的用法,查资料也没太看到很好的解释,有机会向同学请教一下!

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == NULL) return l2;
        if (l2 == NULL) return l1;
        if (l1->val <= l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};
class Solution {
public:   
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { 
    ListNode dummy(INT_MIN);       
    ListNode* tail = &dummy;
	while (l1 && l2) {          
	    if (l1->val < l2->val) {
	        tail->next = l1;
                l1 = l1->next;          
            } else {
                tail->next = l2;
                l2 = l2->next;     
	    }          
	    tail = tail->next;     
	}       
	tail->next = l1 ? l1 : l2;      
	return dummy.next;
    }
};

这个代码有毒,复制粘贴了十几遍,总是乱码。。。
题目思路都是两个指针,将指向的数据较小的那个存下来,然后再往后比较。

本周虽然只做了四道题目,但也算是一个不错的开始了!以后会更加努力的!
短期目标:用两周时间,到5.5日,将top 100 liked里的easy做完!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值