leetcode easy problem set

 

 *勿以浮沙筑高台*

 

持续更新........     题目网址:https://leetcode.com/problemset/all/?difficulty=Easy

 

1. Two Sum [4ms]
2. Reverse Integer [12ms] 

    题意:将一个32bit signed integer反转输出,如果反转之后超出32位补码范围 [-2^31,2^31-1],则输出0

    思路:边取模边算结果,结果存longlong判界

 

3. Palindrome Number [112ms]

    题意:判断数字回文,且不要将数字转为字符串

    思路:和第2题一样,非负反转判等

 

4. Roman to Integer [52ms]

     题意:罗马数字串转为数字

    方法:字符串hash

class Solution {
private:
    int case_(int ch)
    {
        switch (ch)
        {
        case 'I': return 1;
        case 'V': return 5;
        case 'X': return 10;
        case 'L': return 50;
        case 'C': return 100;
        case 'D': return 500;
        case 'M': return 1000;
        case 'I' * 55 + 'V': return 4;
        case 'I' * 55 + 'X': return 9;
        case 'X' * 55 + 'L': return 40;
        case 'X' * 55 + 'C': return 90;
        case 'C' * 55 + 'D': return 400;
        case 'C' * 55 + 'M': return 900;
        default:return 0;
        }
    }
public:
    int romanToInt(string str) {
        register int x = 0, i;
        for (i = 1; i < str.size(); ++i)
        {
            register int t = case_(str[i - 1] * 55 + str[i]);
            if (t)x += t, i++;
            else
                x += case_(str[i-1]);
        }
        if (i == str.size())x += case_(str[i - 1]);
        return x;
    }
};
View Code

 

 

5. Longest Common Prefix [4ms]

    题意:一个字符串数组中所有元素的最长公共前缀

    思路:暴力,注意数组可能为空,可能数组只含有一个空串

    

 

6. Valid Parentheses [4ms]

    题意:括号合法匹配

    方法:栈基本操作

class Solution {
public:
    bool isValid(string s) {
        char arr[10006] = { '#' };
        unordered_map<char, char> P{ {'(',')'},{'{','}'},{'[',']'} };
        int index = 1;
        for (auto i : s)
        {
            if (i != P[arr[index - 1]])arr[index++] = i;
            else index--;
        }
        return index == 1;
    }
};

 

7. Merge Two Sorted Lists [8ms]

    题意:合并两个已序链表

    方法:模拟

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (!l1)return l2;
        if (!l2)return l1;
        ListNode* res, *cur, *newNode;
        if (l1->val < l2->val)
        {
            res = new ListNode(l1->val);
            res->next = NULL;
            l1 = l1->next;
        }
        else
        {
            res = new ListNode(l2->val);
            res->next = NULL;
            l2 = l2->next;
        }
        cur = res;
        while (l1 != NULL && l2 != NULL)
        {
            if (l1->val < l2->val)
            {
                newNode = new ListNode(l1->val);
                newNode->next = NULL;
                cur->next = newNode;
                l1 = l1->next;
            }
            else
            {
                newNode = new ListNode(l2->val);
                newNode->next = NULL;
                cur->next = newNode;
                l2 = l2->next;
            }
            cur = cur->next;
        }
        while (l1 != NULL)
        {
            newNode = new ListNode(l1->val);
            newNode->next = NULL;
            cur->next = newNode;
            l1 = l1->next;
            cur = cur->next;

        }
        while (l2 != NULL)
        {
            newNode = new ListNode(l2->val);
            newNode->next = NULL;
            cur->next = newNode;
            l2 = l2->next;
            cur = cur->next;

        }
        return res;
    }
};
View Code

 

 

8. Remove Duplicates from Sorted Array [16ms]

    题意:序列去重 

.·   方法:STL-unique

  

9. Remove Element [4ms]

    题意:移除序列中指定元素

    方法:STL-remove_if

   

 

10.  Implement strStr() [4ms]

     题意:返回b串在a串中出现的首位置

    方法:KMP

class Solution {
int next[100006];

    void GetNext(string p) {
        next[0] = -1;
        int k = -1;
        for (int q = 1; q <= (int)p.size() - 1; q++)
        {
            while (k > -1 && p[k + 1] != p[q])
                k = next[k];
            if (p[k + 1] == p[q])
                k = k + 1;
            next[q] = k;
        }
    }

public:
    int strStr(string s, string p) {
        if (p.empty())return 0;

        GetNext(p);
        register int i = 0, j = 0;
        int k = -1;
        for (int i = 0; i < s.size(); i++)
        {
            while (k >-1 && p[k + 1] != s[i])
                k = next[k];
            if (p[k + 1] == s[i])
                k = k + 1;
            if (k == p.size() - 1)
                return i - p.size() +1;
        }
        return -1;
    }
};
View Code

 

11. Divide Two Integers [12ms]

     题意:两个32bit signed int 做除法,如果结果越界那么输出2^31-1

    方法:存longlong,然后判界输出

 

12. Search Insert Position  [4ms]

     题意:已序序列中找一个数,如果存在,返回index,如果不存在返回插入后使序列仍有序的插入位置

    方法:STL-lower_bound

 13. Maximum Subarray [8ms]

    题意:给定一个数字串,找出其中各个数字相加之和最大的一个子串,输出最大和。

    方法:dp[ ],dp[i]代表前 i 位的最优解,则转移方程为 dp[i] = max(dp[i] + nums[i], nums[i]);

 

14.Length of Last Word [4ms]

    题意:给定一个字符串,里面的空格符将之分割为(0个或一个或)多个子字符串,求最后一个子串的长度    

    方法:利用字符串流将其顺序读出,返回长度

 

15. Plus One [0 ms]

    题意:给定一个数组,这个数组代表一个数,比如【1,2,3】:123,让代表的数+1,然后返回新的数组,比如:【1,2,4】

    解法:从后往前数,第一个不是9的数,让其+1,是9的,变为0

 16. Add Binary [4ms]

    题意:两个二进制字符串相加

    方法:先反转两个字符串,使得低位对齐,然后遍历,进位标记做好即可

class Solution {
public:
    string addBinary(string a, string b) {
       string c = "";
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        int siz = min(a.size(), b.size()), key = 0, i;
        for (i = 0; i < siz; ++i)
        {
            if (a[i] != b[i])    key ? c += '0' : c += '1';
            else
            {
                if (key) c += '1', key = false;
                else c += '0';
                if (a[i] == '1')key++;
            }
        }
        auto fun = [&](string& a) {
            if (a.size() - siz)
            {
                if (key)
                    for (i = siz; i < a.size(); ++i)
                        if (a[i] == '1')c += '0';
                        else
                        {
                            a[i] = '1';
                            key = false;
                            break;
                        }
                if (key)c += '1', key = false;
                else c += string(a.begin() + i, a.end());
            }

        };
        fun(a);
        fun(b);
        if (key)c += '1';
        reverse(c.begin(), c.end());
        return c;
    }
};
View Code

 

17. Sqrt(x)

    题意:求取一个整数的根号取下整

    正解:【0,x】二分答案!!

 

18. Remove Duplicates from Sorted List [8ms]

     题意:删除已序链表重复元素

    解法:遍历删除

 

19. Same Tree [0ms]

    题意:给定两棵二叉树的根节点,判定两棵树的结构是否相同

    解题:中序遍历,一边遍历一边结构判同

 

20. Symmetric Tree [4ms]

    题意:判定一颗二叉树是否左右对称

    解题:同上一题思路,一边遍历,一遍判定结构是否相同。但是,有一个需要注意的地方。

       遍历顺序,中-左-右,中-右-左,判定值序列是否相同,如果为null,记录值为0 !!,切不可省略不存储值!

class Solution {
    vector<int> left,right;
public:
    void trans(TreeNode* root, bool ispre)
    {
        if(root == NULL)
        {
            if(ispre)left.push_back(0);
            else right.push_back(0);
            return;
        }
        if(ispre)left.push_back(root->val);
        else right.push_back(root->val);
        
        if(ispre)trans(root->left, ispre);
        trans(root->right, ispre);
        if(!ispre)trans(root->left, ispre);
    }
    
    bool isSymmetric(TreeNode* root) {
        if(root == NULL)return true;
        trans(root,true);
        trans(root,false);
        return left == right;
    }
};

 

转载于:https://www.cnblogs.com/lv-anchoret/p/9973944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值