题目出处:https://leetcode.com/problems/add-binary/
题目描述:
给定两个二进制字符串,返回它们的总和(也是二进制字符串)。
输入字符串都是非空的,只包含字符1或0。
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
代码:
const addBinary = (a, b) => {
let res = ''; //结果,或者每次计算的余数,1或者0
let letleftover = 0;//是否进位
let i = a.length - 1; //第一个字符串长度
let j = b.length - 1; //第一个字符串长度
while (i >= 0 || j >= 0) {
let sum = leftover;
//把第一个2进制字符串的最后一位计算。记入sum。然后把数组i的下标定位到倒数第二位
if (i >= 0) { sum += parseInt(a[i--]); }
//把第二个2进制字符串的最后一位计算。与sum合计。然后把数组j的下标定位到倒数第二位
if (j >= 0) { sum += parseInt(b[j--]); }
//sum是否进位,若进位,leftover = 1,res = 0,若不进位,leftover = 0,res =1
res = (sum % 2) + res;
leftover = sum / 2 | 0;
}
//根据进位的实际情况讲结果进行拼接
if (leftover > 0) { res = leftover + res; }
return res;
};
思路:
我自己是用parseInt,和toString来进行操作的,实际结果就是当给的字符串数字大了之后,转化成2进制的精度可能不够导致无法通过submission
把2进制的计算过程复现了一遍,做起来还是很复杂,以上是别人的思路解法,我写个注释。
他的思路就是把人怎么算2进制的方法,复制给计算机。从两个2进制的数字的尾部开始进行计算,leftover是进位,res是每一次计算后的结果,每一次的res以字符串的形式相连接就是结果
笔记:
1.parseInt(xxx,radix),radix表示要解析的数字的基数。返回的结果是一个数字类型。
2.xxx.toString(2),得到的结果是2进制的字符串类型