leetcode-67:二进制求和

219 阅读1分钟

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

提示:

每个字符串仅由字符 '0''1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。

这道题如果先把二进制的字符用parseInt来转换成10进制数字,再相加返回二进制的结果是不行的,会造成数字溢出。

所以我们使用正常的数学运算的方法来做

function addBinary(a: string, b: string): string {
  let aLen = a.length; //
  let bLen = b.length; //获取 a b 字符串的长度
  let maxLen = Math.max(aLen, bLen); // 获取最长的字符串
  let result: number[] = [];
  if (aLen === 0) return b; // 如果为空直接返回
  if (bLen === 0) return a;
  if (aLen > bLen) { // 字符串前导补0  可以使用 String.property.padStart()
    let char = "";
    for (let i = 0; i < aLen - bLen; i++) {
      char += "0";
    }
    b = char + b;
  } else if (aLen < bLen) {
    let char = "";
    for (let i = 0; i < bLen - aLen; i++) {
      char += "0";
    }
    a = char + a;
  }
  let i = maxLen;
  let cache = 0; // 进位
  while (i > 0) {
    let aChar = parseInt(a[i-1]);
    let bChar = parseInt(b[i-1]);
    let sum = aChar + bChar + cache; // 相加 数学运算
    if (sum >= 2) {
      result.unshift(sum - 2);
      cache = 1;
    } else {
      result.unshift(sum);
      cache = 0;
    }
    i--;
  }
  cache!==0&& result.unshift(cache); // 如果进位不是0 就添加到数组前面
  return result.join("");
};

image.png

欢迎大佬评论区指导