力扣刷題6月4 兩數相加

Talk is cheap,show me your code!

2. 兩數相加

難度中等4412收藏分享切換爲英文關注反饋

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807

第一版暴力寫,但還是有bug的

/**
 * 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) {
        if(nullptr == l1) return l2;
        if(nullptr == l2) return l1;
        
        if(nullptr == l1->next &&l1->val==0 )
        {
            return l2;
        } 
        if(nullptr == l2->next &&l2->val==0 )
        {
            return l1;
        } 
       
        ListNode* l11 = l1;
        ListNode* l22 = l2;

        vector<int> vl1;
        vector<int> vl2;
        int res1 = 0;
        int res2 = 0;

        int result =0;

        while(l11)
        {
            vl1.push_back(l11->val);//243
            l11=l11->next;
        }
        reverse(vl1.begin(),vl1.end());//342
        while(l22)
        {
            vl2.push_back(l22->val);//564
            l22=l22->next;
        }
        reverse(vl2.begin(),vl2.end());//456
        
        for(int i=0;i<vl1.size();i++)
        {
            res1=res1*10+vl1[i];
        }
        for(int i=0;i<vl2.size();i++)
        {
            res2=res2*10+vl2[i];
        }

        result = res1 + res2;//
        vector<int> v1;

        while(result)
        {
            v1.push_back(result%10);
            result = result/10;
        }

        ListNode* l4 = new ListNode(0);
        ListNode* p1= l4;
       
        for(int i=0;i<v1.size() ; i++)//708
        { 
            ListNode* l5 = new ListNode(v1[i]);
            p1->next=l5;
            p1=l5;
        }
        return l4->next;
    }
};

 

 

第二版:別人的狗腦子纔想出來的辦法

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
    ListNode dummy (0);
    ListNode* p = &dummy;
    int sum = 0;
    while(l1 || l2 || sum)
    {
        if(l1) 
        { 
            sum += l1->val;
            l1 = l1->next;
        }
        if(l2)  
        {
            sum += l2->val;
            l2 = l2->next;
        }
        p->next = new ListNode(sum % 10);           //sum % 10爲當前位的值
        p = p->next;
        sum /= 10;                              //sum/10爲進位的值,並用做下一次求和的初值
    }
    return dummy.next;
    }
};

 

面試題38. 字符串的排列

難度中等46收藏分享切換爲英文關注反饋

輸入一個字符串,打印出該字符串中字符的所有排列。

你可以以任意順序返回這個字符串數組,但裏面不能有重複元素。

示例:

輸入:s = "abc"
輸出:["abc","acb","bac","bca","cab","cba"]

限制:

1 <= s 的長度 <= 8

class Solution {
public:
    vector<string> permutation(string s)
    {
          vector<char> result;
          vector<string> res;
          string temp_str="";
          for(int i=0;i<s.size();i++)
          {
              result.push_back(s.at(i));
          }

          sort(result.begin(),result.end());//這邊是防止next_permutation字典序列舉的時候少元素
          
          do{
               temp_str = "";
               for(int i=0;i<s.size();i++)
               {
                   temp_str = temp_str+result[i];
               }
              res.push_back(temp_str);
          }while(next_permutation(result.begin(),result.end()));

          return res;
    }
};

 

 

 

/*next_permutation(start,end),和prev_permutation(start,end)。這兩個函數作用是一樣的,區別就在於前者求的是當前排列的下一個排列,後一個求的是當前排列的上一個排列。至於這裏的“前一個”和“後一個”,我們可以把它理解爲序列的字典序的前後*/
class Solution {
public:
    vector<string> permutation(string s) {
        if(s.empty()) return {};
        sort(s.begin(), s.end());
        vector<string> ans;
        ans.push_back(s);
        while(next_permutation(s.begin(), s.end())){
            ans.push_back(s);
        }
        return ans;
    }
};


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章