Skip to content

67、二进制求和

js
;(function () {
  /**
   * 67. 二进制求和
   * 给你两个二进制字符串,返回它们的和(用二进制表示)。
   * 输入为 非空 字符串且只包含数字 1 和 0。
   *
   * 输入: a = "11", b = "1"
   * 输出: "100"
   *
   * 输入: a = "1010", b = "1011"
   * 输出: "10101"
   *
   */

  function addBinary(a: string, b: string): string {
    // 方法一:
    // let aLen = a.length;
    // let bLen = b.length;
    // let res: string[] = [];
    // let isEnter: number = 0;
    // while (aLen > 0 || bLen > 0 || isEnter) {
    //     let numA = +(a.charAt(aLen - 1) || '0');
    //     let numB = +(b.charAt(bLen - 1) || '0');
    //     if (numA + numB + isEnter === 3) {
    //         res.unshift('1')
    //         isEnter = 1;
    //     } else if (numA + numB + isEnter === 2) {
    //         res.unshift('0')
    //         isEnter = 1;
    //     } else if (numA + numB + isEnter === 1) {
    //         res.unshift('1')
    //         isEnter = 0;
    //     } else {
    //         // 全部等于0
    //         res.unshift('0');
    //         isEnter = 0;
    //     }
    //     aLen--;
    //     bLen--;
    // }
    // return res.join('')

    // 方法二:优化方法一
    let aLen = a.length
    let bLen = b.length
    let res: string[] = []
    let isEnter: number = 0
    while (aLen > 0 || bLen > 0 || isEnter) {
      let numA = +(a.charAt(aLen - 1) || '0')
      let numB = +(b.charAt(bLen - 1) || '0')
      let addRes = numA + numB + isEnter // 结果只有 0 1 2 3 四种情况
      if (addRes > 1) {
        res.unshift(addRes % 2 === 1 ? '1' : '0')
        isEnter = 1
      } else if (addRes === 1) {
        res.unshift('1')
        isEnter = 0
      } else {
        // 全部等于0
        res.unshift('0')
        isEnter = 0
      }
      aLen--
      bLen--
    }
    return res.join('')
  }

  // let  a = "11", b = "1";
  let a = '1010',
    b = '1011'
  console.log(addBinary(a, b))
})()