leetcode 算法题067 (简单016) 二进制求和
- 题目介绍
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
- 示例
输入: a = “11”, b = “1”
输出: “100”
输入: a = “1010”, b = “1011”
输出: “10101”
- 解法一
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
let sum = '', i = 0, flag = '0', longStr = a.length > b.length ? a : b, shortStr = a.length > b.length ? b : a;
while(i < shortStr.length) {
if(shortStr[shortStr.length - 1 - i] === longStr[longStr.length - 1 - i]) {
sum = flag + sum;
if(shortStr[shortStr.length - 1 - i] === '1') {
flag = '1';
} else {
flag = '0';
}
} else {
sum = (flag === '1' ? '0': '1') + sum;
}
i++;
}
while(i < longStr.length) {
let c = longStr[longStr.length - 1 - i];
if(c !== flag) {
sum = '1' + sum;
flag = '0';
} else {
sum = '0' + sum;
}
i++;
}
return flag === '0' ? sum : '1' + sum;
};
执行用时 : 88ms, 在所有 JavaScript 提交中击败了87.05%的用户
内存消耗 : 35.6MB, 在所有 JavaScript 提交中击败了54.01%的用户
- 解法二
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
a = a.padStart(Math.max(a.length, b.length), '0');
b = b.padStart(Math.max(a.length, b.length), '0');
let sum = '',
i = a.length - 1,
flag = '0';
while (i >= 0) {
if (a[i] === b[i]) {
sum = flag + sum;
flag = (a[i] === '0' ? '0' : '1');
} else {
sum = ((flag === '0' ? '1' : '0') + sum);
}
i--;
}
return flag === '0' ? sum : '1' + sum;
};
执行用时 : 92ms, 在所有 JavaScript 提交中击败了77.27%的用户
内存消耗 : 35.7MB, 在所有 JavaScript 提交中击败了45.57%的用户
- 注意
如果不存在越界问题 或者想要分割字符串去加 也可以把 string变成二进制 通过位运算去加 然后再转回字符串