Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定两个字符串形式的整数,计算它们的和并同样以字符串形式返回。
输入: num1 = "11", num2 = "123"
输出: "134"
二、思路分析:
我们从小就学过加法运算,应该先算个位,然后算十位,最后算百位。
我们需要注意的是个位和个位进行运算,由于两个数字可能位数不一样,我们可以通过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('')
}
我们发现只要把基数改一下就可以,会一个,其他的都会了。只有记住计算公式,以后面试再也不怕了。