掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。
二、思路分析:
- 先将 a 和 b 转化成十进制数,求和后再转化为二进制数
const sum = parseInt(a,2)+parseInt(b,2); // 二进制转化成十进制 求和,
return sum.toString(2); // 返回十进制转二进制数
还是一个特大数的问题,溢出了就有问题
- 只好一步一步来循环遍历了
- 先把位数补齐,前面位数不够的补 0,当两数之和大于等于2 就进一位,当前和就要把2减去;和不超过2,当前和就是当前值,不进位
三、AC 代码
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
while (a.length > b.length) b = '0' + b; // b先对齐位数
while (a.length < b.length) a = '0' + a; // a先对齐位数
let res = new Array(a.length); // 用来保存最后加的和
let sum = 0;
let carry = 0 // 进位
// 从右向左计算
for (let i = a.length - 1; i >= 0; i--) {
sum = Number(a[i]) + Number(b[i]) + carry; // 每次相加都要加上位数
if (sum >= 2) {
res[i] = sum - 2;
carry = 1; // 逢二进一
} else {
res[i] = sum; // 和不超过2,就不进位
carry = 0;
}
}
if (carry) res.unshift(1) // 最左边如果有进位,循环结束还要进1,则在res数组前端加一个1
return res.join('')
};
四、总结
- 当然不止一种方法,还有位运算,自己觉得不够熟悉,就没再写了;
仅供学习参考