67. 二进制求和|刷题打卡

152 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述:

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

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


示例 1:

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

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

提示:

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


二、思路分析:

  • 先将 a 和 b 转化成十进制数,求和后再转化为二进制数
const sum = parseInt(a,2)+parseInt(b,2); // 二进制转化成十进制 求和,
return sum.toString(2); // 返回十进制转二进制数

还是一个特大数的问题,溢出了就有问题
  • 只好一步一步来循环遍历了
  • 先把位数补齐,前面位数不够的补 0,当两数之和大于等于2 就进一位,当前和就要把2减去;和不超过2,当前和就是当前值,不进位

三、AC 代码

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function(a, b) {
  while (a.length > b.length) b = '0' + b; // b先对齐位数
  while (a.length < b.length) a = '0' + a; // a先对齐位数
  let res = new Array(a.length); // 用来保存最后加的和
  let sum = 0;
  let carry = 0 // 进位
  // 从右向左计算
  for (let i = a.length - 1; i >= 0; i--) {
    sum = Number(a[i]) + Number(b[i]) + carry; // 每次相加都要加上位数
    if (sum >= 2) {
      res[i] = sum - 2; 
      carry = 1; // 逢二进一
    } else {
      res[i] = sum; // 和不超过2,就不进位
      carry = 0;
    }
  }
  if (carry) res.unshift(1) // 最左边如果有进位,循环结束还要进1,则在res数组前端加一个1
  return res.join('')

};

四、总结

  • 当然不止一种方法,还有位运算,自己觉得不够熟悉,就没再写了;

仅供学习参考

参考题目