Talk is cheap,show me your code!
難度中等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;
}
};
難度中等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;
}
};