「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。
题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
提示:
- 每个字符串仅由字符
'0'或'1'组成。 1 <= a.length, b.length <= 10^4- 字符串如果不是
"0",就都不含前导零。
解题思路
思路1
整体思路是将两个字符串较短的用 00 补齐,使得两个字符串长度一致,然后从末尾进行遍历计算,得到最终结果。
本题解中大致思路与上述一致,但由于字符串操作原因,不确定最后的结果是否会多出一位进位,所以会有 2 种处理方式:
第一种,在进行计算时直接拼接字符串,会得到一个反向字符,需要最后再进行翻转 第二种,按照位置给结果字符赋值,最后如果有进位,则在前方进行字符串拼接添加进位
代码
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
let ans = "";
let ca = 0;
for(let i = a.length - 1, j = b.length - 1;i >= 0 || j >= 0; i--, j--) {
let sum = ca;
sum += i >= 0 ? parseInt(a[i]) : 0;
sum += j >= 0 ? parseInt(b[j]) : 0;
ans += sum % 2;
ca = Math.floor(sum / 2);
}
ans += ca == 1 ? ca : "";
return ans.split('').reverse().join('');
};
思路2
- 模拟自己手算二进制的情况
- 从低位开始,逐个计算a+b+进位的和
- 如果和为2,则进位,和更新为0
- 如果和为3,则进位,和更新为1
- 否则进位为0
代码
const addBinary = (a, b) => {
// 返回数组
const res = [];
// 进位
let c = 0;
// 两指针初始化尾部
let [i, j] = [a.length - 1, b.length - 1];
while (i >= 0 || j >= 0 || c) {
// 获取指针指向的数字
const aa = Number(a[i]) ? Number(a[i]) : 0;
const bb = Number(b[j]) ? Number(b[j]) : 0;
// 计算sum
let sum = aa + bb + c;
if (sum === 2) {
// sum为2,进位,sum归0
sum = 0;
c = 1;
} else if (sum === 3) {
// sum为2,进位,sum归1
sum = 1;
c = 1;
} else {
c = 0;
}
// 更新后的sum从数组头部插入数组
res.unshift(sum);
i--;
j--;
}
// 返回字符串
return res.join('');
};
思路3
代码中有注释,二进制,逢二进一
代码
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
a=a.split('')
b=b.split('')
let res=''
let c=0
while(a.length||b.length||c){
// 二进制就是逢二进1
// console.log('c',c)
// ~~true 1
// true+1 =2 false+1=1
// ~~有Math.floor的功能 但比Math.floor强大 ~~null==>0 ~~undefined ==>0
c +=~~a.pop()+~~b.pop() // 后面开始
res=c%2+res
c=c>1 // 如果c是2继续处理
}
return res
};