66. 加一

自己做
解:逢十進位

class Solution {
public:vector<int> plusOne(vector<int>& digits) {int add = 1; //進位vector<int> res(digits.size() + 1); //防止多一位的情況:9 + 1 = 10for(int i = (int)digits.size() - 1; i >= 0; i--){int num = digits[i] + add; //當前相加的結果add = num / 10; //下一個數的進位res[i + 1] = num % 10; //余位放進結果中digits[i] = num % 10; //余位放進結果中}//如果相加后的結果比原先的數多一位,那么就補上進位,否則就返回正常的結果(比如8+1 = 9不會多一位)if(add != 0){res[0] = add;return res;}elsereturn digits;}
};

67. 二進制求和

自己做

解:同十進制處理
class Solution {
public:string addBinary(string a, string b) {int add = 0; //進位int p = (int)a.size() - 1; //a的尾指針int q = (int)b.size() - 1; //b的尾指針bool a_or_b = true; //判斷a與b誰更長if(a.size() < b.size())a_or_b = false;while(p >= 0 && q >= 0){int num = a[p] - '0' + b[q] - '0' + add; //本位相加結果add = num / 2; //進位if(a_or_b) //如果a更長就加到a上去a[p] = num % 2 + '0';else //如果b更長就加到b上去b[q] = num % 2 + '0';p--;q--;}while(p >= 0){ //加完以后還剩下aint num = a[p] - '0' + add; //本位相加結果add = num / 2; //進位a[p--] = num % 2 + '0'; }while(q >= 0){ //加完以后還剩下bint num = b[q] - '0' + add; //本位相加結果add = num / 2; //進位b[q--] = num % 2 + '0'; }//如果相加后的結果比原先的數多一位,那么就補上進位,否則就返回不考慮進位的結果if(add != 0){if(a_or_b)return "1" + a;elsereturn "1" + b;}else{if(a_or_b)return a;elsereturn b;}}
};

解:邏輯運算符處理
class Solution {
public:string addBinary(string a, string b) {bool add = false; //進位int p = (int)a.size() - 1; //a的尾指針int q = (int)b.size() - 1; //b的尾指針bool a_or_b = true; //判斷a與b誰更長(默認a更長)if(a.size() < b.size()) //如果b更長a_or_b = false;while(p >= 0 && q >= 0){if(a[p] == b[q]){ //要么同為1,要么同為0,不管如何,a+b相加結果的余位都為0bool is_one = true; //判斷是否同為1if(a[p] == '0')is_one = false;if(a_or_b) //如果a更長就加到a上去a[p] = add + '0';else //如果b更長就加到b上去b[q] = add + '0';if(is_one) //1 + 1有進位的情況add = true;else //0 + 0無進位的情況add = false;}else{ //兩者為1和0,不管如何,a+b相加結果的余位都為1//有進位的情況=> 1 + 0 + 1,進位1,余位0,無進位的情況=> 1 + 0 + 0,進位0,余位1if(a_or_b) //如果a更長就加到a上去a[p] = '1' - add;else //如果b更長就加到b上去b[q] = '1' - add; //進位保持不變}p--;q--;}while(p >= 0){ //加完以后還剩下aif(!add) //如果沒有進位就直接結束計算break;else{ //如果有進位就要考慮計算if(a[p] == '1'){ //原位1與進位1相加a[p] = '0';//進位保持不變}else{ //原位0與進位1相加a[p] = '1';add = false;}}p--;}while(q >= 0){ //加完以后還剩下aif(!add) //如果沒有進位就直接結束計算break;else{ //如果有進位就要考慮計算if(b[q] == '1'){ //原位1與進位1相加b[q] = '0';//進位保持不變 }else{ //原位0與進位1相加b[q] = '1';add = false;}}q--;}//如果相加后的結果比原先的數多一位,那么就補上進位,否則就返回不考慮進位的結果if(add){if(a_or_b)return "1" + a;elsereturn "1" + b;}else{if(a_or_b)return a;elsereturn b;}}
};
