zoukankan      html  css  js  c++  java
  • leetcode 中等题(1)

    2. Add Two Numbers(中等)

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            ListNode* first = l1;
            ListNode* second = l2;
            int result1=0,result2=0;
            long long result=0;
            stack<int> S;
            int count=0;
            
            while(l1 != NULL){
                S.push(l1->val);
                l1 = l1->next;
            }
                
                
            count = S.size()-1;
            while(!S.empty()){
                result1 += pow(10,count--) * S.top();
                S.pop();
            }
                
            
            while(l2 != NULL){
                S.push(l2->val);
                l2 = l2->next;
            }
                
            count = S.size()-1;
            while(!S.empty()){
                result2 += pow(10,count--) * S.top();
                S.pop();
            }
                
            result = result1 + result2;
            delete first,second;
            
            // ListNode*p = new ListNode(-1);  //头节点
            ListNode* pHead = NULL;
            ListNode* p = pHead;
            
            if(!result){
                ListNode* q = new ListNode(0);
                pHead = q;
            }
            while(result){
                int val = result % 10;
                result /= 10;
                
                ListNode* q = new ListNode(val);
                if(pHead == NULL){
                    pHead = q;
                    p = q;
                }
                else{
                    p->next = q;
                    p = p->next;
                }
            }
            return pHead;
        }
    };
    此方法会溢出,超过long long 型范围
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {   //正确解法,按位相加,注意进位
        ListNode *head = NULL, *prev = NULL;
        int carry = 0;
        while (l1 || l2) {
            int v1 = l1? l1->val: 0;
            int v2 = l2? l2->val: 0;
            int tmp = v1 + v2 + carry;
            carry = tmp / 10;
            int val = tmp % 10;
            ListNode* cur = new ListNode(val);
            if (!head) head = cur;
            if (prev) prev->next = cur;
            prev = cur;
            l1 = l1? l1->next: NULL;
            l2 = l2? l2->next: NULL;
        }
        if (carry > 0) {
            ListNode* l = new ListNode(carry);
            prev->next = l;
        }
        return head;
    }

     3, Longest Substring Without Repeating Characters.(很慢)

    int lengthOfLongestSubstring(string s) {
    
        int maxLength = 0;
        int count;
        for(int i=0;i<s.length();i++){
            string currString = "";
            count = 0;
            for(int j=i;j<s.length();j++){
                if(currString.find(s[j])>=currString.length()){
                    currString += s[j];
                    count++;
                    cout<<s[j]<<endl;
                    cout<<"string:"<<currString<<endl; 
                    if(count>maxLength) maxLength = count;
                } 
                else{
                    break;
                }
            }
        }
        return maxLength;
    }

    5, Longest Palindromic Substring.(很慢)

    string longestPalindrome(string s) {
        string maxString = "";
        int maxLength = 0;
        int count = 0;
            
        for(int i=0;i<s.length();i++){
            string Str = "";
            int index = s.rfind(s[i]);
            int start = i;
            int end = index;
            int count = 0;
            int ii=start;
                
            while(ii<=index){
                if(s[ii]==s[index]){ii++;index--;}
                else{
                    ii = start;
                    index = end-1;
                    end--;
                }   //匹配失败
            }
                
            if(ii>index){  //匹配成功
                for(int k=start;k<=end;k++)
                    Str += s[k];
                count = Str.length();
            }
            if(count>=maxLength) {maxString = Str;maxLength=count;}
        }
        return maxString;
    }

     8. String to Integer (atoi)(中等,参考)

    int myAtoi(string str) {
        long result = 0;
        int indicator = 1;
        for(int i = 0; i<str.size();)
        {
            i = str.find_first_not_of(' ');
            if(str[i] == '-' || str[i] == '+')
                indicator = (str[i++] == '-')? -1 : 1;
            while('0'<= str[i] && str[i] <= '9') 
            {
                result = result*10 + (str[i++]-'0');
                if(result*indicator >= INT_MAX) return INT_MAX;
                if(result*indicator <= INT_MIN) return INT_MIN;                
            }
            return result*indicator;
        }
        return 0;
    }

     15,3Sum(中等)

        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> res;
            int sum;
            sort(nums.begin(),nums.end());
            for(int i=0;i<nums.size();i++){
                if(i>0 && nums[i]==nums[i-1])
                    continue;
                int l=i+1;
                int r=nums.size()-1;
    
                while(l<r){
                    sum = nums[i]+nums[l]+nums[r];
                    if(sum<0) l++;
                    else if(sum>0) r--;
                    else{
                        res.push_back(vector<int>{nums[i],nums[l],nums[r]});
                        while(nums[l]==nums[l+1]) l++;   //去除重复
                        while(nums[r]==nums[r-1]) r--;
                        l++;
                        r--;
                    }
                }
                
            }
            return res;
        }

     11. Container With Most Water(很慢)

        int maxArea(vector<int>& height) {
            int maxAreas=0;
            int currAreas=0;
            for(int i=0;i<height.size();i++){
                for(int j=i+1;j<height.size();j++){
                    currAreas = (j-i)*min(height[i],height[j]);
                    if(currAreas>maxAreas) maxAreas = currAreas;
                }
            }
            return maxAreas;
        }

     12. Integer to Roman(中等)

        string intToRoman(int num) {
            const string THOUS[]={"","M","MM","MMM"};
            const string HUNDS[]=              {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
            const string TENS[]={"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
            const string ONES[]={"","I","II","III","IV","V","VI","VII","VIII","IX"};
            
            string result = "";
            result += THOUS[num/1000]; num %= 1000;
            result += HUNDS[num/100]; num %= 100;
            result += TENS[num/10]; num %= 10;
            result += ONES[num%10];
            
            return result;
        }

     16. 3Sum Closest(较快)

        int threeSumClosest(vector<int>& nums, int target) {
            sort(nums.begin(),nums.end());
            int minDist=INT_MAX;
            int res=0;
            for(int i=0;i<nums.size();i++){
                int l=i+1;
                int r=nums.size()-1;
                while(l<r){
                    int sum = nums[i]+nums[r]+nums[l];
                    if(sum==target) return sum;
                    if(abs(sum-target)<minDist) {res=sum;minDist=abs(sum-target);}
                    if(sum>target) r--;
                    else l++;
                }//while
            }
            return res;
        }
    };

     17. Letter Combinations of a Phone Number(较快)

        vector<string> letterCombinations(string digits) {
            if(digits.empty()) return vector<string>();
            vector<string> result;
            result.push_back("");
            vector<string> src = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
            for(int i=0;i<digits.size();i++){
                int num = digits[i]-'0';
                if(num<0 || num>9) break;
                const string& candidate = src[num];
                if(candidate.empty()) continue;
                vector<string> tmp;
                for(int j=0;j<candidate.size();j++){
                    for(int k=0;k<result.size();k++)
                        tmp.push_back(result[k]+candidate[j]);
                }
                result.swap(tmp);
            }
            return  result;
        }

     19. Remove Nth Node From End of List(中等)

        ListNode* removeNthFromEnd(ListNode* head, int n) {
            if(head == NULL) return NULL;
            ListNode* after=head;
            ListNode* befor=head;
            ListNode* toBeDelete;
            
            
            for(int i=0;i<n;i++){
                befor = befor->next;
                if(befor==NULL) return head->next;
            }
                
            while(befor->next!=NULL){
                befor = befor->next;
                after = after->next;
            }
            
            toBeDelete = after->next;
            after->next = toBeDelete->next;
            delete toBeDelete;
            toBeDelete = NULL;
            
            return head;
        }

     22. Generate Parentheses(中等)

        vector<string> res;
        void helper(string str,int left,int right){
            if(left==0 && right==0) res.push_back(str);
            if(left!=0) helper(str+'(',left-1,right);
            if(right!=0 && right>left) helper(str+')',left,right-1);
        }
        
        vector<string> generateParenthesis(int n) {
            helper("",n,n);
            return res;
        }

     24. Swap Nodes in Pairs(较快)

        ListNode* swapPairs(ListNode* head) {
            if(head==NULL) return NULL;
            ListNode tmp(0);
            ListNode* curr=head;
            ListNode* pre=&tmp;
            tmp.next=head;
    
            while(curr && curr->next){
                pre->next=curr->next;
                pre=pre->next;
                curr->next=pre->next;
                pre->next=curr;
                pre=curr;
                curr=curr->next;
            }
            return tmp.next;
        }
    所有博文均为原著,如若转载,请注明出处!
  • 相关阅读:
    python中关于with以及contextlib的使用
    Python之Redis操作
    Python操作memecache
    COM组件技术名称解释
    C++11-新增正则表达式
    BSTR与char*、cstring、CComBSTR的转换
    ATL字符宏使用以及代码测试
    获取与一个磁盘的组织以及剩余空间容量有关的信息以及代码测试
    关于cstring ->string-> const char * 用U2A一步转换 错误的内存问题
    cstring、string、wstring、int、char*、tchar、 int、dword等相互转换代码输出测试
  • 原文地址:https://www.cnblogs.com/zpcoding/p/10198061.html
Copyright © 2011-2022 走看看