LeetCode.415 字符串相加

188 阅读2分钟

这是我参与更文挑战的第1天,活动详情查看: 更文挑战

题目描述:

原题地址

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

提示

  • num1num2 的长度都小于 5100
  • num1num2 都只包含数字 0-9
  • num1num2 都不包含任何前导零
  • 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式

思路分析

双指针法

通俗点说就是我们小时候学加法的时候老师教的那个竖列式计算。

从低位对齐,两数末尾运算相加,超过十就产生进位,从低往高依次运算。

image.png

用代码模拟的话,也就是双指针法,定义2个指针,分别指向num1num2的末尾,即最低位。

再定义一个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()
    }
}

总结

这一题还是相当简单的,看了一圈题解也没其他的什么特殊的解法了。

参考

官方解题

字符串相加 (双指针,清晰图解)