Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".
将两个字符串进行二进制加减法。
思想是从两个字符串的末尾开始相加,将本位结果记在结果字符串中,进位记在一个变量中。
我一开始的实现是这样的:
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
var num1 = a.length-1;
var num2 = b.length-1;
var bit = 0;
if (num1>=num2) {
var temp = "";
while (num2>=0) {
var result = parseInt(a[num1])+parseInt(b[num2])+bit;
if (result === 0) {
bit = 0;
temp = '0' + temp;
} else if (result === 1) {
bit = 0;
temp = '1' + temp;
} else if (result === 2) {
bit = 1;
temp = '0' + temp;
} else {
bit = 1;
temp = '1' + temp;
}
num1--;
num2--;
}
while (num1>=0) {
var result = parseInt(a[num1])+bit;
if (result === 1) {
bit = 0;
temp = '1' + temp;
} else if (result === 0) {
bit = 0;
temp = '0' + temp;
} else {
bit = 1;
temp = '0' + temp;
}
num1--;
}
if (bit===1)
temp = '1' + temp;
return temp;
} else {
return addBinary(b,a);
}
};
简单粗暴的办法。
后来在网上看到了别人的解法虽然思想是一样的,人家的就优雅的多:
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
var s = "";
var c = 0;
var i = a.length - 1;
var j = b.length - 1;
while(i >= 0 || j >= 0 || c == 1)
{
c += i >= 0 ? parseInt(a[i --]) : 0;
c += j >= 0 ? parseInt(b[j --]) : 0;
s = (c % 2) + s;
c = parseInt(c / 2);
}
return s;
};
首先,优雅的解决字符串长短的问题,不管i和j谁先到头,到头了就不加了就好了;
其次,使用一个变量c同时解决本位结果和本位进位,c本身有4种可能的值:0,1,2,3,c%2就是本位结果,c/2就是本位进位;
当i,j都进行完时,如果c还等于1,那就意味着要多一个最高位,while循环同时也能处理这种情况。