题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
解题思路
- 错误的思考
- 首先我们想到的是转换成数字,然后做加法,最后以2进制返回。但是这样的思考方式不正确,因为超过了数字的最大长度
- 正确的思路
- 首先我们不管传入的是什么,我们都让第一个是长的哪个。
- 之后我们把这两个字符串转换成只有一个数字的数组
- 我们取出两个数组的长度差取出来。
- 遍历短的数组,把对应的位置加入到长数组中。
- 之后利用while循环,讲数组中出现二的时候全部进位。
- 最后我们返回这个数组转换成的字符串。
代码
- 话不多说,我们上代码。
var addBinary = function (a, b) {
// 始终让第一项的长度大于第二项
if (a.length < b.length) [a, b] = [b, a];
// 把传入的字符串改成数组在转换成数字,避免直接转换成数字后长度溢出
a = a.split("").map(Number);
b = b.split("").map(Number);
// 来计算两个数组长度的差,下面遍历时使用
let difference = a.length - b.length;
for (let i = 0; i < b.length; i++) {
// 遍历从后面相加每一项
a[difference + i] = b[i] + a[difference + i]
}
// 这里利用while循环把每个2都向前进位。
while (a.indexOf(2) !== -1) {
let current = a.indexOf(2);
a[current] = 0;
if (current === 0) {
a.unshift(1);
continue;
}
a[current - 1] += 1;
}
// 返回数组转换成字符串之后
return a.join("")
};
网友评论