leetcode 练习

1.华为面试题一

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

class Solution {
public:
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int left = 0;
        int i = 0;
        for (; i < s.size(); i++)
        {
            if (s[i] == ' ')
            {
                reverse(s.begin() + left, s.begin() + i );
                left = i +1;            
            }
        }
        if (left <= i - 1)
        {
            reverse(s.begin() + left, s.begin() + i);
        }

       
        cout << s << endl;
        return s;
    }
    
};

 

 

5 leetcode

#include <iostream>

#include <string>

#include <algorithm>

#include <vector>

using namespace std;

 

#define MAX(a,b)  ((a)>(b)?(a):(b)) 

 

class Solution {

public:

    string longestPalindrome(string s) {

        if (s.size() == 0)

            return "";

        if (s.size() == 1)

            return s;

        int n = s.size();

        int max = 1;

        int leftmax = 0;

        for (int i = 0; i < n; i++)

        {

            int j = i + 1;

            int r = i-1;

            while (j < n&&r >= 0 && s[r] == s[j])  //奇数

            {

 

                int t=MAX(max, j - r + 1);

                if (max <t)

                    leftmax = r;

                max = t;

                r--;

                j++;

            }

            

            j = i+1;

            r = i;

            while (j < n&&r >= 0 && s[r] == s[j]  )  //偶数

            {

                int t = MAX(max, j - r + 1);

                if (max <t)

                    leftmax = r;

                max = t;

                r--;

                j++;    

                

            }

            

        }

        cout << s.substr(leftmax, max) << endl;

        return s.substr(leftmax, max);

    }

    

};

 6

class Solution {

public:

    string convert(string s, int numRows) {

        if(numRows==1) return s;

        int n=s.size();

        vector<string> vec(min(n,numRows));

        bool bflag=false;

        int row=0;

        for(int i=0;i<n;i++)

        {

            vec[row]+=s[i];

            

            if(row==0 || row==numRows-1)

                    bflag=!bflag; 

            

            if(bflag)

                row++;

            else

            {

                row--;

            }

            

        }

        string res;

        for(string t:vec)

        {

            res+=t;

        }

    

         return res;

    }

};

 

7.

class Solution {

public:

      int reverse(int x) {

        long res=0;

        while(x!=0)

        {

            res=res*10+x%10;

            x=x/10;

        }

        return  res>2147483647||res<-2147483648?0:res;

    }

};

 

8.

  int myAtoi(string str) {

        int n=str.size();

        int i=0;

        for(;i<n;i++)

        {

            if(str[i]!=' ')

                break;

        }

        int b=1;

        int j=i;

        long res=0;

        if(str[i]=='-')

        {

            j++;

            b=-1;

        }

        if(str[i]=='+')

        {

            j++;

            b=1;

        }

 

        for(;j<n;j++)

        {

            if(str[j]>='0'&&str[j]<='9')

            {

                res=res*10+str[j]-'0';

                if((b*res)>2147483647)

                {

                    res=2147483647;

                    break;

                }

                if((b*res)<-2147483648)

                {

                    res=-2147483648;

                    break;

                }

                    

            }

            else

            {

                break;

            }

            

        }

        res*=b;

        cout<<res<<endl;

        return res;

    }

 

9.

 bool isPalindrome(int x) {

        if(x<0)

            return false;

        long rx=0,num=x;

        while(num!=0)

        {

            rx=rx*10+num%10;

            num=num/10;

        }

        if(x==rx)

            return true;

        else

        {

            return false;

        }       

    }

 

10.

// //正则表达式匹配

//     bool isMatch(const string& s,const  string& p)

//     {

//         return doMatch(s, 0, p, 0);

//     }

//     // 考察s串从sIndex开始的子串与模式串p中从pIndex开始的子串是否匹配(均包括开始位置直到末尾)。

//     bool doMatch(const string& s, int sIndex, const string& p, int pIndex)

//     {

//      if (pIndex >= p.size()) return sIndex >= s.size(); //p索引大于p长度,str到末尾则表示匹配成功,否则失败

 

//      bool currentMatch = sIndex < s.size() && (s[sIndex] == p[pIndex] || p[pIndex] == '.');

 

//         if(pIndex + 1 < p.size() && p[pIndex + 1] == '*')

//         {

//          // *匹配0个字符(无论当前字符匹不匹配这都有可能s = abbc, p = ab*bbc) || 当前字符匹配并尝试s中的下一个字符

//          return doMatch(s, sIndex, p, pIndex + 2) || (currentMatch && doMatch(s, sIndex + 1, p, pIndex));

//         }

//         else // 没有*

//         {

//          // 正常匹配,包括了.

//             // 匹配上就考察下一个,否则 return false

//          return currentMatch && doMatch(s, sIndex + 1, p, pIndex + 1);

//         }

//     }

11.

    int maxArea(vector<int>& height)

    {

        //双指针法移动

        int len=height.size();

        int max=0;

        int j=len-1;

        for(int i=0;i<j;)

        {

             max=MAXTF(MINTF(height[i],height[j])*j-i,max);

             if(height[i]<height[j])

             {

                 i++;

             }

             else

             {

                 j--;

             }        

        }

        return max;

    }

 

12.

    string intToRoman(int num)

    {

        if(num<1||num>3999)

            return "";

        vector<int> store={1000,900,500,400,100,90,50,40,10,9,5,4,1};

        vector<string> str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};

        string res;

        int size=store.size();

        for(int i=0;i<size;i++)

        {

            while(num>=store[i])

            {

                res.append(str[i]);

                num-=store[i];

            }

        }

        return res;

    }

 

13.

        int romanToInt(string s)

        {

            map<char,int> s_v=

            {

            make_pair('M',1000),make_pair('D',500),make_pair('C',100),make_pair('L',50),

            make_pair('X',10),make_pair('V',5),make_pair('I',1)

            };

            if(s.size()==0)

                return 0;

            s+="I";

            int res=0;

            int i=0;

            for(;i<s.size()-1;i++)

            {

                if(s_v[s[i]]>=s_v[s[i+1]])

                    res+=s_v[s[i]];

                else    res-=s_v[s[i]];

            }

            return res;

        }

14.

 string longestCommonPrefix(vector<string>& strs)

    {

        if(strs.size()==0)  return "";

        if(strs.size()==1)    return strs[0];

        string res="";

        for(int i=0;i<strs[0].size();i++)

        {

            for(int j=1;j<strs.size();j++)

            {

                if(strs[0][i]!=strs[j][i])

                {

                    return res;

                }

            }

             res.push_back(strs[0][i]);

        }

        return res;

    }

15.

vector<vector<int>> threeSum(vector<int>& nums)

    {

        sort(nums.begin(),nums.end());

        vector<vector<int>> res;

        if(nums.size()<3)   return res;

        int len=nums.size();

        int l=1,r=len-1;

        for(int i=0;i<nums.size()-2;i++)

        {

            l=i+1;

            r=len-1;

            if(nums[i]>0||nums.size()<3)   break;

            if(i>0&&nums[i]==nums[i-1])  continue;

            while(l<r)

            {

                if((nums[i]+nums[l]+nums[r])==0)

                {

                    vector<int> t={nums[i],nums[l],nums[r]};

                    res.push_back(t);

                    l++;

                }

                else if(r+1<nums.size()&&nums[r]==nums[r+1]||(nums[i]+nums[l]+nums[r])>0)

                    r--;

                else if(l>i&&nums[l]==nums[l-1]||(nums[i]+nums[l]+nums[r])<0)

                    l++;

            }         

        }

        return res;

    }

16.

    int threeSumClosest(vector<int>& nums, int target) {

        sort(nums.begin(), nums.end());

        if (nums.size() < 3) {

            int res = 0;

            for (int i = 0; i < nums.size(); i++) {

                res += nums[i];

            }

            return res;

        }

        int isum = nums[0] + nums[1] + nums[2];

        for (int i = 0; i < nums.size(); i++) {

            int left = i + 1, right = nums.size() - 1;

            while (left < right) {

                int csum = nums[i] + nums[left] + nums[right];

                if (abs(csum - target) < abs(isum - target))

                    isum = csum;

                if (csum < target)

                    left++;

                else if (csum > target)

                    right--;

                else

                    return target;

            }

        }

        return isum;

    }

17

  map<char,string> mapc={

            {'2',"abc"},

            {'3',"def"},

            {'4',"ghi"},

            {'5',"jkl"},

            {'6',"mno"},

            {'7',"pqrs"},

            {'8',"tuv"},

            {'9',"wxyz"}

        }  ;

     vector<string> res;

        string s;

    void dnf(int index ,string digits)

    {

        if(index==digits.size())

        {

            res.push_back(s);

            return ;

        }

        for(int i=0;i<mapc[digits[index]].size();i++)  //按键对应的字母

        {

            s.push_back(mapc[digits[index]][i]);

            dnf(index+1,digits);

            s.pop_back();

        }

    }

    vector<string> letterCombinations(string digits)

    {

        if(digits.size()==0)

            return res;

        dnf(0,digits);

        return res;

    }

 

18

  vector<vector<int>> fourSum(vector<int>& nums, int target) {

      vector<vector<int>> res;

       if(nums.size()<4)

             return res;

      sort(nums.begin(),nums.end());

      int size=nums.size();

        for(int i=0;i<nums.size()-3;i++)

        {

            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)  break;

            if(nums[i]+nums[size-1]+nums[size-2]+nums[size-3]<target) continue;

            if(i>0 && nums[i]==nums[i-1])  continue;

            for(int j=i+1;j<size-2;j++)

            {

                if(nums[i]+nums[j]+nums[j+1]+nums[j+2] >target)  break; 

                 if(nums[i]+nums[j]+nums[size-1]+nums[size-2]<target) continue;

                if(j>i+1 && nums[j]==nums[j-1])  continue;

                int left=j+1,right=size-1;

                while(left<right)

                {

                    if((nums[i]+nums[j]+nums[left]+nums[right])==target)

                    {

                         vector<int> tv={nums[i],nums[j],nums[left],nums[right]};

                         res.push_back(tv);

                         int tleft=left,tright=right;

                         while(left<right && nums[tleft]==nums[left])  left++;

                         while(left<right && nums[tright]==nums[right]) right--;

                    }

                    if((nums[i]+nums[j]+nums[left]+nums[right])<target)

                    left++;

                    else if((nums[i]+nums[j]+nums[left]+nums[right])>target)

                    right--;

                }

            }          

        }

        return res;

    }

19

      ListNode* removeNthFromEnd(ListNode* head, int n) {

        vector<ListNode *>  nodeVec;

        if(head==NULL)

            return head;

        ListNode * p=head;

        while(p)

        {

            nodeVec.push_back(p);

            p=p->next;

        }

        if(n==nodeVec.size())

            return head->next;

        nodeVec[nodeVec.size()-n-1]->next=nodeVec[nodeVec.size()-n]->next;

        delete nodeVec[nodeVec.size()-n];

        nodeVec[nodeVec.size()-n]=NULL;

        return head;

    }

20

    bool isValid(string s) {
        bool b = false;
        stack<char> ls;
        ls.push(' ');
        map<char, char> mapcc = {
            { '(', ')' },
            { '[', ']' },
            { '{', '}' },
            { ' ', ' ' },
        };
        for (int i = 0; i < s.size(); i++)
        {
            if (mapcc[ls.top()] == s[i])
            {
                ls.pop();
            }
            else
            {
                ls.push(s[i]);
            }
        }
        return ls.size() > 1 ? false : true;
    }

21

  ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

      ListNode *p=NULL,*phead=new ListNode(-1);

      p=phead;

      while(l1!=NULL && l2 !=NULL)

      {

          if(l1->val > l2->val)

          {

              p->next=l2;

              l2=l2->next;

          }

          else{

              p->next=l1;

              l1=l1->next;

          }

          p=p->next;

      }

      p->next= (l1==NULL)?  l2: l1;

        return phead->next;

    }

22

回溯法

      vector<string> generateParenthesis(int n) {

         vector<string> res;

         dfs(res,"",0,0,n);

        return res;

    }

    void dfs(vector<string> &res,string cur,int l,int r,int n)

    {

        if(r>l||l>n||r>n) return ;

       if(l==n  && r==n) 

        {

            res.push_back(cur);

            return ;

        } 

        dfs(res,cur+"(",l+1,r,n);

        dfs(res,cur+")",l,r+1,n);        

    }

23

    ListNode* mergetwoList(ListNode *l1,ListNode *l2)

    {

        if(l1==NULL)    return l2;

        if( l2==NULL)   return l1;

        if(l1->val > l2->val)

        {

             l2->next=mergetwoList(l1,l2->next);

             return l2;

        }

        else{

             l1->next=mergetwoList(l1->next,l2);

             return l1;

        }

    }

 

    ListNode* mergeKLists(vector<ListNode*>& lists) {

        if(lists.size()==0) return NULL; 

        ListNode *phead=lists[0];

        for(int i=1;i<lists.size();i++)

        {

            phead=mergetwoList(phead,lists[i]);

        }

        return phead;

    }

24.

 ListNode *swapPairs(ListNode *head)

    {

       if(head==NULL|| head->next ==NULL)  return head;

        ListNode *node=head->next;

        head->next=swapPairs(head->next->next);

        node->next=head;

        return node;

    }

 

26

    int removeDuplicates(vector<int>& nums) {

        int res=0,t=0;

        int size=nums.size();

        nums.push_back(1);

        for(int i=0;i<size;i++)

        {

            

            nums[t]=nums[i];

            t++;

            while(nums[i]==nums[i+1]&& i+1<size) i++ ;

        }

        return t;

    }

27.

 

    int removeElement(vector<int>& nums, int val) {

        int i=0,j=0;

        for(;j<nums.size();j++)

        {

            if(nums[j]!=val)

            {

                nums[i++]=nums[j];

            }

        }

        return i;

    }

42.

    int trap(vector<int>& height)

    {

        int left=0;

        int len=height.size();

        if(len==0)  return 0;

        int cur=height[0],res=0;

        int m=max_element(height.begin(),height.end())-height.begin();

        for(int i=1;i<m;i++)

        {

            if(height[i]>=cur)

            {

                cur=height[i];

            }

            else

            {

                res+=(cur-height[i]);

            }    

        }

        cur=height[len-1];

        for(int j=len-2;j>m;j--)

        {

            if(height[j]>=cur)

                cur=height[j];

            else

            {

                res+=(cur-height[j]);

            }   

        }

        return res;

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值