给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字1
和0
。
输入: a = "11", b = "1"
输出: "100"
输入: a = "1010", b = "1011"
输出: "10101"
- 每个字符串仅由字符
'0'
或'1'
组成。 1 <= a.length, b.length <= 10^4
。- 字符串如果不是
"0"
,就都不含前导零。
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
var longer = "";
var shorter = "";
if(a.length > b.length){
longer = a;
shorter = b.padStart(a.length,0);
}else{
longer = a.padStart(b.length,0);
shorter = b;
}
var target = "";
var addition = 0;
for(let i=longer.length-1;i>=0;--i){
let unitNum = ~~(longer[i]) + ~~(shorter[i]) + addition;
addition = 0;
if(unitNum >= 2) {
addition = 1;
target = `${unitNum-2}${target}`;
}else{
target = `${unitNum}${target}`;
}
}
if(addition) target = `1${target}`;
return target;
};
首先需要将两个字符串的长度进行统一,判断两个字符串长度的长度,然后选出短的字符串在字符串前填充0
,也就是使用String.prototype.padStart()
方法进行填充,然后定义目标字符串以及进位标记变量,然后从后开始往前遍历字符串,将字符串中的字符转换成数字类型然后相加并与进位变量相加,其中~~
就是利用位运算将字符转换成数字,相加完成后将进位标志置为0
,然后判断字符是否大于2
,如果大于等于2
则将相加的字符减掉2
并将进位标记记为1
,若小于2
则直接拼接字符串,然后不断循环完成目标字符的拼接,若最后依然有进位标志,则直接拼接1
到目标字符串前,然后返回目标字符串即可。
https://github.com/WindrunnerMax/EveryDay
https://leetcode-cn.com/problems/add-binary