问题
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
输入: a = "11", b = "1"
输出: "100"
输入: a = "1010", b = "1011"
输出: "10101"
分析
动手计算总结规律。
1)首先,需要将短的一个在前面进行补0,使两个数组长度相同。
2)从后往前逐位相加。其中,返回值头部为(sum+jw)%2,进位为(sum+jw)/2。
3)最后,当jw不为0时,返回值头部要追加进位。
代码
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
// 转化为数组
var as = a.split('')
var bs = b.split('')
// 补零
var al = as.length
var bl = bs.length
if(al < bl){
for(var i=1;i<= bl-al;i++){ as.unshift('0')}
}else{
for(var i=1;i<= al-bl;i++){ bs.unshift('0')}
}
// 从后向前逐位求和
var sum = 0
var jw = 0
var res = ''
for(var i=as.length-1;i>=0;i--){
// 对应位置之和【注意转化为数值】
sum = as[i]*1+bs[i]*1
// 返回值头部
res = (sum+jw)%2 + res
// 进位
jw = Math.floor((sum+jw)/2)
}
// 最后,当jw不为0时,返回值头部追加进位
if(jw){res = jw + res}
// 返回结果
return res
};