【leetcode】67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
输入:a = “11”, b = “1”
输出:“100”
说一下我的思路:同一位上 有可能有三个值 ,a的值,b的值,和下一位进位产生的值。这三个值都是0或者1。所以此位的结果就可能是三者之和0, 1, 2, 3四种情况,针对四种情况各自处理该位的结果和进位值就可以了。
再说一下处理四种情况技巧。直接四个if 判断是最基本的。然后可以利用求余 和 求商简化代码。但是这里也可以特别的使用按位与和按位右移。
if (count === 0) {
res = '0' + res;
carry = 0;
} else if (count === 1) {
res = '1' + res;
carry = 0;
} else if (count === 2) {
res = '0' + res;
carry = 1;
} else {
res = '1' + res;
carry = 1;
}
----->
res = (sum % 2) + res;
carry = Math.floor(sum / 2);
---->
res = (sum & 1) + res;
carry = sum >>> 1;
完整代码:
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function (a, b) {
const lenA = a.length;
const lenB = b.length;
const maxLen = Math.max(lenA, lenB);
let cur = 0;
let carry = 0;
let res = '';
while (cur < maxLen) {
cur++;
let curA = +(a[lenA - cur] ?? 0);
let curB = +(b[lenB - cur] ?? 0);
let sum = carry + curA + curB;
res = (sum & 1) + res;
carry = sum >>> 1;
}
return carry ? carry + res : res;
};
总结
- 判断一个数
x
的+1
周期变化(奇偶性),可以使用x & 1
来判断。 - 判断一个数
x
的+n
周期变化,可以使用( x / n ) & 1
来判断。 - 特殊的,
x / 2
可以使用x >>> 1
来完成,所以判断一个数x
的+2
周期变化,也可以使用x >>> 1 & 1
来判断。