本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
输入: a = "1010", b = "1011"
输出: "10101"
题目解析
思路一
取长字符串的长度,将短字符串用0往前填充补齐长度,方便后面遍历数值相加,用一个长度一样项初始都为0的数组去存储遍历中相加的数值,并做进位处理,注意最后的进位
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function (a, b) {
let len = 0
if (a.length > b.length) {
len = a.length
b = b.padStart(len, 0)
} else {
len = b.length
a = a.padStart(len, 0)
}
let arr = new Array(len).fill(0)
for (let i = len - 1; i >= 0; i--) {
let sum = a[i] - 0 + (b[i] - 0)
arr[i] += sum
if (arr[i] > 1) {
arr[i] = arr[i] - 2
if (typeof arr[i - 1] !== 'undefined') {
arr[i - 1] = 1
} else {
arr.unshift(1)
break
}
}
}
return arr.join('')
};
思路二
这里使用循环,先找到较短字符串的长度,以他为循环条件,从末尾开始循环相加,存到一个新的数组,加完之后再将唱的字符串拼接到新数组中,最后循环判断。
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
const num1 = a.split('');
const num2 = b.split('');
const num3 = [];
const minLength = Math.min(num1.length, num2.length);
if (minLength === num1.length) {
for (let i = minLength - 1; i >= 0; i--) {
num3.unshift(Number(num1[i]) + Number(num2[num2.length + i - minLength]));
}
for (let j = num2.length - minLength - 1; j >= 0; j--) {
num3.unshift(Number(num2[j]));
}
} else {
for (let i = minLength - 1; i >= 0; i--) {
num3.unshift(Number(num2[i]) + Number(num1[num1.length + i - minLength]));
}
for (let j = num1.length - minLength - 1; j >= 0; j--) {
num3.unshift(Number(num1[j]));
}
}
for (let i = num3.length - 1; i >= 0; i--) {
if (num3[i] > 1 && i != 0) {
num3[i] = num3[i] % 2;
num3[i - 1]++;
} else if (num3[i] > 1 && i == 0) {
num3[i] = num3[i] % 2;
num3.unshift(1);
} else {
continue;
}
}
return num3.join('');
};
思路三
先声明最大长度,然后对数字进行补零,最后转换为数组,在声明一个变量进行进位,进行循环,如果相加为3则进1,当前位为1,如果相加为2则进1,当前位为0,相加为1或0则不进位,当前位为三个值的和,循环完之后,进位为1的则首位进行补1
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
let len = Math.max(a.length,b.length)
a = a.padStart(len,0)
b = b.padStart(len,0)
let arr1 = a.split('').map((el)=>Number(el))
let arr2 = b.split('').map((el)=>Number(el))
let jin = 0
let res = []
for(let i=len-1;i>=0;i--){
if(arr1[i]+arr2[i]+jin>2){
res.unshift(1)
jin=1
}else if(arr1[i]+arr2[i]+jin>1){
res.unshift(0)
jin=1
}else {
res.unshift(arr1[i]+arr2[i]+jin)
jin=0
}
}
if(jin>0)res.unshift(1)
return res.join('')
};