二进制求和
解题思路:
-
两个二进制数字相加,从它们的末位开始遍历:
- 若对应位数都是 0,则依然是 0,进位为 0;
- 若一个是 0,一个是 1,则变成 1,进位为 0;
- 若两个都是 1,则变为 0,进位为 1;
-
因为二进制只有 0,1,根据以上规律,容易联想到异或运算:
- 两数相同异或为 0,0 与任意数字异或为数字本身;
- 所以相加的位数为 a[i] ^ b[j] ^ add;
- 初始化进位 add = 0,若 a[i]、b[i]、add 中有两个及两个以上数字为1,则 add 为 1;
-
遍历数组后,已更改全部位数,若此时进位为 1,则需在首部添加 1;
代码实现:
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--) {
// 位数不够,默认为 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('');
};
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('');
};
8.字符串转换整数(atoi)
上一篇