题目描述
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例
输入:a = "11", b = "1"
输出:"100"
思路分析
我们可以先将其转化为整数,相加之后再转为二进制,但是这样的处理方式不能过掉全部样例。字符串的长度可能非常长,int类型会超出限制,因此如果使用js时可以考虑转化为bigInt类型的,再进行相加。
另一种方法,也就是遍历字符串的每一项,对进位进行处理,这种方法是比较使用大多数相加类型案例的。
对于相加,我们可以使用位运算符,关于位运算符的使用我们可以参考下图:
参考代码
//方法一:
var addBinary = function(a, b) {
let result = []
let curry = 0
let len = Math.max(a.length,b.length)
a = a.padStart(len,'0')
b = b.padStart(len,'0')
for(let i = len -1; i>= 0; i --) {
let aAt = a.charAt(i)===''?0 :Number(a.charAt(i))
let bAt = b.charAt(i)===''?0:Number(b.charAt(i))
let tmp = aAt + bAt + curry
if(tmp == 3 || tmp == 2) {
curry = 1
tmp == 3 ? result.unshift(1) : result.unshift(0)
}else if(tmp == 1 || tmp == 0) {
curry = 0
tmp == 1 ? result.unshift(1) :result.unshift(0)
}
}
if(curry==1) result.unshift(1)
return result.join('')
};
//方法二:
var addBinary = function(a, b) {
let add = 0
let sum = []
for(let i = a.length -1, j = b.length -1; i >= 0 || j >= 0; i--, j--) {
let num1 = +a[i] || 0
let num2 = +b[j] || 0
sum.unshift(num1 ^ num2 ^ add)
add = num1 + num2 + add > 1 ? 1 : 0
}
if (add === 1) sum.unshift(1)
return sum.join('')
};
//方法三:
function addBinary(a: string, b: string): string {
let add = 0;
let sum = [];
for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {
// 位数不够,默认为 0
let num1 = +a[i] || 0;
let num2 = +b[j] || 0;
// 两数相同异或为0,0与任意数字异或为数字本身
sum.unshift(num1 ^ num2 ^ add);
add = num1 + num2 + add > 1 ? 1 : 0;
}
if (add === 1) sum.unshift(1);
return sum.join('');
};
//方法四:
//转化位bigint类型
var addBinary = function(a, b) {
var a = '0b' + a;
var b = '0b' + b;
var sum = BigInt(a) + BigInt(b);
return sum.toString(2);
};
标签:tmp,二进制,sum,unshift,add,let,result,67,leetcode
From: https://www.cnblogs.com/zx529/p/16852064.html