2019.1.17
题目描述:
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"
这题是二进制加法,本质上是与十进制加法类似的,只不过由遇十进一变成了遇二进一。
解法一:
设置一个进位carry,初值是0,,我们可以用两个指针分别从两个字符串的末尾开始向高位遍历,将三者相加,得到的和对二取余的值,加到结果字符串中,对二进行除法的值,赋给进位carry。如果在循环结束后carry是1,则需要在最高位增加一个1,即在结果字符串首部加1。
这里需要注意一点的是,如果两个字符串长度是不一致的,那么我们需要对较短的字符串前面补0,由于二进制的特点,高位补0是不影响二进制的值的,所以如果字符串可以取出值,就将字符取出再减去'0'得到int值,如果不能取出值,就直接赋0进行运算。
C++代码:
class Solution {
public:
string addBinary(string a, string b) {
string res;
int i=a.size()-1,j=b.size()-1,carry=0,m,n,sum;
while(i>=0||j>=0){
if(i>=0)
m=a[i--]-'0';
else
m=0;
if(j>=0)
n=b[j--]-'0';
else
n=0;
sum=m+n+carry;
res=to_string(sum%2)+res;
carry=sum/2;
}
if(carry==1)
res="1"+res;
return res;
}
};
执行时间:4ms
PS.可以考虑用三目运算符来使代码美观
优化后C++代码:
class Solution {
public:
string addBinary(string a, string b) {
string res = "";
int i = a.size() - 1, j = b.size() - 1, carry = 0,m,n,sum;
while (i >= 0 || j >= 0) {
m = i >= 0 ? a[i--] - '0' : 0;
n = j >= 0 ? b[j--] - '0' : 0;
sum = m + n + carry;
res = to_string(sum % 2) + res;
carry = sum / 2;
}
return carry == 1 ? "1" + res : res;
}
};