这是我参与更文挑战的第1天,活动详情查看: 更文挑战
题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
提示
num1和num2的长度都小于 5100num1和num2都只包含数字 0-9num1和num2都不包含任何前导零- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式
思路分析
双指针法
通俗点说就是我们小时候学加法的时候老师教的那个竖列式计算。
从低位对齐,两数末尾运算相加,超过十就产生进位,从低往高依次运算。
用代码模拟的话,也就是双指针法,定义2个指针,分别指向num1和num2的末尾,即最低位。
再定义一个carry表示进位,然后从最低位往高位开始顺序运算,模拟我们生活中的加法的做法。
这里要注意索引溢出的问题,因为我们2个字符串肯定有长度不同的时候,这个时候,我们只要简单的将索引溢出的直接赋值0 就ok了,相当于对较短的数进行了低位补零对齐操作。
然后进位就是相加结果对10做除法,其实有进位的话肯定为1。
当前结果就是相加结果对10取模。
AC代码
class Solution {
fun addStrings(num1: String, num2: String): String {
var n1 = num1.lastIndex
var n2 = num2.lastIndex
var carry = 0
var ans = StringBuffer()
while (n1 >= 0 || n2 >= 0 || carry != 0) {
var tempN1 = if (n1 >= 0) num1[n1] - '0' else 0
var tempN2 = if (n2 >= 0) num2[n2] - '0' else 0
var result = tempN1 + tempN2 + carry
ans.append(result % 10)
carry = result / 10
n1--
n2--
}
return ans.reverse().toString()
}
}
总结
这一题还是相当简单的,看了一圈题解也没其他的什么特殊的解法了。