var addBinary = function(a, b) {
// 取a,b最大长度
let max=Math.max(a.length,b.length)
// 取a,b长度差值
let dValue=Math.abs(b.length-a.length)
// 计算当前和,判断是否进位
let currentSum=0
// 保存进位
let preSum=0
// 数组处理后转换成字符串返回
let backs=[]
// 从后向前遍历两数组,将元素相加,保存进位,向backs数组中添加元素
for(let i=max-1;i>=0;i--){
if(a.length>=b.length){
if(a[i]&&b[i-dValue]){
currentSum=Number(a[i])+Number(b[i-dValue])+preSum
}else if(a[i]&&!b[i-dValue]){
currentSum=Number(a[i])+preSum
}else{
currentSum=Number(b[i-dValue])+preSum
}
}else{
if(b[i]&&a[i-dValue]){
currentSum=Number(b[i])+Number(a[i-dValue])+preSum
}else if(b[i]&&!a[i-dValue]){
currentSum=Number(b[i])+preSum
}else{
currentSum=Number(a[i-dValue])+preSum
}
}
//在这里重置preSum,要看preSum赋值和使用的先后顺序,在中间重置
preSum=0
if(currentSum===3){
// 特殊情况,如果是最后一次遍历产生进位则不保存进位,直接添加元素
if(i===0){
backs.push("1")
backs.push("1")
break
}
preSum=1
backs.push("1")
}else if(currentSum===1){
backs.push("1")
}else if(currentSum===2){
// 特殊情况,如果是最后一次遍历产生进位则不保存进位,直接添加元素
if(i===0){
backs.push("0")
backs.push("1")
break
}
preSum=1
backs.push("0")
}else{
backs.push("0")
}
}
// 因为我们是从后向前遍历a,b,所以我们生成的数组是倒序的,要翻转数组后转成字符串返回
return backs.reverse().join("")
};
时间复杂度为O(n),为a,b数组的最大长度,空间复杂度为O(1),除去保存结果占用的空间后额外使用了常数个变量