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
原文地址:https://www.cnblogs.com/mr-stn/p/9031058.html