问题描述:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1
or 0
.
Example 1:
Input: a = "11", b = "1" Output: "100"
Example 2:
Input: a = "1010", b = "1011" Output: "10101"
源码:
用循环逐个找进位进行了,但是时间不理想,如下:
class Solution {
public:
string addBinary(string a, string b) {
int n1 = a.size(), n2 = b.size();
string result;
int i=n1-1, j=n2-1, carry=0;
while(i>=0 && j>=0){
int tmp = (a[i]-'0') + (b[j]-'0') + carry;
carry = tmp/2;
result.insert(result.begin(), tmp % 2+'0');
i--; j--;
}
while(i>=0){
int tmp = (a[i]-'0') + carry;
carry = tmp/2;
result.insert(result.begin(), tmp % 2+'0');
i--;
}
while(j>=0){
int tmp = (b[j]-'0') + carry;
carry = tmp/2;
result.insert(result.begin(), tmp % 2+'0');
j--;
}
if(carry == 1) result.insert(result.begin(), '1');
return result;
}
};
网上还有一种做法,把三个循环并到一起,貌似没有啥提升,还多个判断,结果不理想;
class Solution {
public:
string addBinary(string a, string b) {
string result = ""; // Initialize result
int s = 0; // Initialize digit sum
// Traverse both strings starting from last
// characters
int i = a.size() - 1, j = b.size() - 1;
while (i >= 0 || j >= 0 || s == 1)
{
// Comput sum of last digits and carry
s += ((i >= 0)? a[i] - '0': 0);
s += ((j >= 0)? b[j] - '0': 0);
// If current digit sum is 1 or 3, add 1 to result
result = char(s % 2 + '0') + result;
// Compute carry
s /= 2;
// Move to next digits
i--; j--;
}
return result;
}
};