给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。
这道题如果先把二进制的字符用parseInt来转换成10进制数字,再相加返回二进制的结果是不行的,会造成数字溢出。
所以我们使用正常的数学运算的方法来做
function addBinary(a: string, b: string): string {
let aLen = a.length; //
let bLen = b.length; //获取 a b 字符串的长度
let maxLen = Math.max(aLen, bLen); // 获取最长的字符串
let result: number[] = [];
if (aLen === 0) return b; // 如果为空直接返回
if (bLen === 0) return a;
if (aLen > bLen) { // 字符串前导补0 可以使用 String.property.padStart()
let char = "";
for (let i = 0; i < aLen - bLen; i++) {
char += "0";
}
b = char + b;
} else if (aLen < bLen) {
let char = "";
for (let i = 0; i < bLen - aLen; i++) {
char += "0";
}
a = char + a;
}
let i = maxLen;
let cache = 0; // 进位
while (i > 0) {
let aChar = parseInt(a[i-1]);
let bChar = parseInt(b[i-1]);
let sum = aChar + bChar + cache; // 相加 数学运算
if (sum >= 2) {
result.unshift(sum - 2);
cache = 1;
} else {
result.unshift(sum);
cache = 0;
}
i--;
}
cache!==0&& result.unshift(cache); // 如果进位不是0 就添加到数组前面
return result.join("");
};