前往此题

解题思路

题目要求不能使用内建库,也不能直接将直接将输入值转换成整型数值,所以我们只能将字符进行拆解运算。嗯。。。感觉回到了红白机时代。

算法过程

  1. 设定i, j 指向num1,nums2的尾部开始从末位进行运算,模拟数学的加法
  2. 设定进位carry,用于标记进位数
  3. 遍历结束条件:当i0 或者j0时表示某一个数字已经遍历完成,位数长的那一方剩余的数字直接放入结果中即可(也要考虑进位carry
  4. 计算进位方式: carry = tmp % 10,默认为0, 其中tmp代表 n1 + n2 + carry, n1, n2代表当然遍历的字符num[i], num[j]
  5. 遍历完成后考虑carry是否为0,如果不为0则需要进位
  6. 最后将结果以str(tmp % 10) + res的方式返回给res

代码

class Solution:
    def addStrings(self, num1: str, num2: str) -> str:
        res = ""
        i, j = len(num1) - 1, len(num2) - 1
        carry = 0

        while i >= 0 or j >= 0 or carry != 0:
            n1 = int(num1[i]) if i >=0 else 0
            n2 = int(num2[j]) if j >=0 else 0
            tmp = n1 + n2 + carry
            carry = tmp // 10
            res = str(tmp % 10) + res
            i, j = i - 1, j - 1
        return res

复杂度分析

  • 时间复杂度: O(max(m, n))
  • 空间复杂度: O(1)