题目:
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
思路:1. 首先我们要理解 二进制是什么意思,网上有很多文章对此进行讲解,这里不再加以详细说明。
2. 我们要想清楚的是, 无论用什么进制, 做加法的时候必然要考虑的事情就是会有进位。据此, 我们要想清楚二进制的进位在咱们代码里如何实现。 下面假设 进上来的量是carry(可能的量是 0 或1 ), 目前在两个string上的 数字分别是 a, b(a , b 所有可能的组合是 10,01,11,00)。那么每次对同一位上的数字进行加法可能的结果是 0, 1, 2, 3. 如果是0,1则 接下来carry 是0, 同时现在的位数 就是相加的结果。 如果是 2,3 则下一位相加时的carry 会变成1, 同时现在的位数 结果应该是目前结果余二。
3. 我们要考虑的是如果两个string 不一边长, 那么最后一个剩余, 我们要把这个考虑到。所以以上了 可以先找出两个string 较大的那个。用小的长度进行for loop, 最后再看大的是否用完。
代码:
java版本:
public class Solution {
public String addBinary(String a, String b) {
if(a.length() < b.length()){// make the longer string a, and short string b
String tmp = a;
a = b;
b = tmp;
}
String res = "";
int carry = 0;
int i, j;
for(i = a.length() - 1 , j = b.length() - 1; i >= 0 && j >=0; i --, j--){
int sum = carry + (int)(a.charAt(i) - '0')+ (int)(b.charAt(j) - '0');
int val = sum % 2;
carry = sum/2;
res = val+res;
}
while(i >= 0){
int sum = carry + (a.charAt(i) - '0');
int val = sum % 2;
carry = sum/2;
res = val+res;
i -- ;
}
if(carry == 1)
res = "1"+res;
return res;
}
}
char* addBinary(char* a, char* b) {
char * tmp, *result;
int i,j,val, sum, carry = 0, lenA,lenB;
lenA = strlen(a);
lenB = strlen(b);
printf("len of a is %d, len of b is %d\n", lenA, lenB);
if(lenA < lenB){
tmp = a;
a = b;
b = tmp;
}
lenA = strlen(a);
lenB = strlen(b);
result = malloc((lenA+1)*sizeof(char));
result[lenA] = '\0';
i = lenA -1;
j = lenB -1;
while(j >= 0){
sum = (a[i]- '0') + (b[j]- '0') + carry;
val = sum%2;
carry = sum/2;
result[i] = val +'0';
j --;
i --;
}
while(i >= 0){
sum = (a[i]- '0') + carry;
val = sum%2;
carry = sum/2;
result[i] = val +'0';
i --;
}
printf("result is %s\n",result);
if(carry == 1){
i = strlen(result);
tmp = malloc((i+ 2)*sizeof(char));
tmp [0] = '1';
tmp[1] = '\0';
printf("tmp is %s", tmp);
result = strcat(tmp, result);
}
return result;
}
为大家提供一个ruby代码,非常简单:
# @param {String} a
# @param {String} b
# @return {String}
def add_binary(a, b)
(a.to_i(2) + b.to_i(2)).to_s(2)
end