字符串相加(10进制/2进制)

731 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给定两个字符串形式的整数,计算它们的和并同样以字符串形式返回。

输入: num1 = "11", num2 = "123"
输出: "134"

二、思路分析:

我们从小就学过加法运算,应该先算个位,然后算十位,最后算百位。

截屏2022-03-13 下午5.42.08.png

我们需要注意的是个位和个位进行运算,由于两个数字可能位数不一样,我们可以通过0来代替,比如'011'+'123'。

还有就是我们的十进制的数,要处理好进位关系。比如'9'+'9'结果为'18',满10进1即可。

function addStrings (num1, num2) {
  let i = num1.length - 1
  let j = num2.length - 1
  let add = 0
  const ans = []
  while (i >= 0 || j >= 0 || add !== 0) {
    const x = i >= 0 ? +num1[i] : 0
    const y = j >= 0 ? +num2[j] : 0
    const result = x + y + add
    ans.push(result % 10)
    add = Math.floor(result / 10)
    i -= 1
    j -= 1
  }
  return ans.reverse().join('')
}

上面代码中i表示第一个数的计算位置,j表示第二个数的计算位置,add表示进位。从低到高逐位相加。如果当前位和超过 10,则向高位进一位。

由于我们是从后往前进行计算,将计算结果保存在数组中,最后我们应该反转数组并且拼接字符串最后得到计算结果。

四、总结:

加法计算虽然看起来简单,但是实现起来还是挺复杂的,要处理好进位关系。

好了,我们现在已经掌握了10进制的加法如何实现,那么接下再实现一个二进制的加法。

注意:输入是两个二进制字符串,计算它们的和并同样以二进制字符串形式返回。

输入: a = "11", b = "10"
输出: "101"

这下简单,代码都很类似:

function addStrings (num1, num2) {
  let i = num1.length - 1
  let j = num2.length - 1
  let add = 0
  const ans = []
  while (i >= 0 || j >= 0 || add !== 0) {
    const x = i >= 0 ? +num1[i] : 0
    const y = j >= 0 ? +num2[j] : 0
    const result = x + y + add
    ans.push(result % 2)
    add = Math.floor(result / 2)
    i -= 1
    j -= 1
  }
  return ans.reverse().join('')
}

我们发现只要把基数改一下就可以,会一个,其他的都会了。只有记住计算公式,以后面试再也不怕了。