题目描述:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
解题思路:
这个题目没啥好说的了,就是普通人脑子里最正常的思路,跟前面的链表求和的一样,设置个进位标志位就行啦。虽然代码看上去挺长的,但是思路很简答,就需要注意一些细节的东西就行了。
代码实现(Java语言):
class Solution {
public String addBinary(String a, String b) {
int i = a.length()-1,j = b.length()-1;
int max = Math.max(i,j);
char[] res = new char[max+2];
int len = max + 1;
char[] aa = a.toCharArray();
char[] bb = b.toCharArray();
int carry = 0;
while(i>=0&&j>=0){
if(aa[i] == '1' && bb[j] == '1'){
res[len--] = carry==0?'0':'1';
carry = 1;
}else if(aa[i] == '0' && bb[j] == '0'){
res[len--] = carry==0?'0':'1';
carry = 0;
}else{
if(carry == 1){
res[len--] = '0';
carry = 1;
}else{
res[len--] = '1';
carry = 0;
}
}
i--;
j--;
}
while(i >= 0){
if(carry == 0){
res[len--] = aa[i];
}else{
if(aa[i] == '1'){
res[len--] = '0';
carry = 1;
}else{
res[len--] = '1';
carry = 0;
}
}
i--;
}
while(j >= 0){
if(carry == 0){
res[len--] = bb[j];
}else{
if(bb[j] == '1'){
res[len--] = '0';
carry = 1;
}else{
res[len--] = '1';
carry = 0;
}
}
j--;
}
if(carry == 1){
res[len--] = '1';
}else{
res[len--] = ' ';
}
return new String(res).trim();
}
}