leetcode 67. 二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
1 #include<algorithm> 2 class Solution { 3 public: 4 string addBinary(string a, string b) { 5 if(a.size()<b.size()){//让a保存a,b中最长的字符串 6 string temp = a; 7 a = b; 8 b = temp; 9 }//翻转字符串,便于运算 10 reverse(a.begin(), a.end()); 11 reverse(b.begin(), b.end()); 12 int carry = 0; 13 for(int i=0; i<b.size(); i++){ 14 int t = (a[i]-'0') + (b[i]-'0') + carry; 15 if(t>=2){//满2进1 16 a[i] = (t%2)+'0'; 17 carry = 1; 18 }else{ 19 a[i] = t + '0'; 20 carry = 0; 21 } 22 } 23 for(int i=b.size(); i<a.size(); i++){ 24 int t = (a[i]-'0') + carry; 25 if(t>=2){ 26 a[i] = '0'; 27 carry = 1; 28 }else{ 29 a[i] = t + '0'; 30 carry = 0; 31 } 32 } 33 if(carry == 1) a += '1'; 34 reverse(a.begin(), a.end()); 35 return a; 36 } 37 };
在b的后面添加'0', 让加法趋于一致
1 #include<algorithm> 2 class Solution { 3 public: 4 string addBinary(string a, string b) { 5 if(a.size()<b.size()){//让a保存a,b中最长的字符串 6 string temp = a; 7 a = b; 8 b = temp; 9 }//翻转字符串,便于运算 10 reverse(a.begin(), a.end()); 11 reverse(b.begin(), b.end()); 12 int carry = 0; 13 for(int i=b.size(); i<a.size(); i++) b += '0'; 14 for(int i=0; i<a.size(); i++){ 15 int t = (a[i]-'0') + (b[i]-'0') + carry; 16 if(t>=2){//满2进1 17 a[i] = (t%2)+'0'; 18 carry = 1; 19 }else{ 20 a[i] = t + '0'; 21 carry = 0; 22 } 23 } 24 if(carry == 1) a += '1'; 25 reverse(a.begin(), a.end()); 26 return a; 27 } 28 };
进一步精简代码,把重复的操作合并,减少不必要的操作
1 #include<algorithm> 2 class Solution { 3 public: 4 string addBinary(string a, string b) { 5 if(a.size()<b.size()) swap(a, b); 6 int carry = 0; 7 for(int i=b.size(); i<a.size(); i++) b = '0' + b; 8 for(int i=a.size()-1; i>=0; i--){ 9 int t = (a[i]-'0') + (b[i]-'0') + carry; 10 a[i] = (t%2) + '0'; 11 carry = t/2; 12 } 13 if(carry == 1) a = '1' + a; 14 return a; 15 } 16 };
有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565