Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100".
將兩個字符串進行二進制加減法魄梯。
思想是從兩個字符串的末尾開始相加丧失,將本位結果記在結果字符串中偎肃,進位記在一個變量中慨飘。
我一開始的實現(xiàn)是這樣的:
/**
* @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);
}
};
簡單粗暴的辦法。
后來在網(wǎng)上看到了別人的解法雖然思想是一樣的腺逛,人家的就優(yōu)雅的多:
/**
* @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;
};
首先怖糊,優(yōu)雅的解決字符串長短的問題,不管i和j誰先到頭峡迷,到頭了就不加了就好了银伟;
其次,使用一個變量c同時解決本位結果和本位進位绘搞,c本身有4種可能的值:0彤避,1,2夯辖,3琉预,c%2就是本位結果,c/2就是本位進位蒿褂;
當i圆米,j都進行完時尖阔,如果c還等于1,那就意味著要多一個最高位榨咐,while循環(huán)同時也能處理這種情況介却。