解题思路
题目要求不能使用内建库,也不能直接将直接将输入值转换成整型数值,所以我们只能将字符进行拆解运算。嗯。。。感觉回到了红白机时代。
算法过程
- 设定
i
,j
指向num1
,nums2
的尾部开始从末位进行运算,模拟数学的加法 - 设定进位
carry
,用于标记进位数 - 遍历结束条件:当
i
为0 或者j
为0时表示某一个数字已经遍历完成,位数长的那一方剩余的数字直接放入结果中即可(也要考虑进位carry
) - 计算进位方式:
carry = tmp % 10
,默认为0, 其中tmp
代表n1 + n2 + carry
,n1, n2
代表当然遍历的字符num[i], num[j]
- 遍历完成后考虑
carry
是否为0,如果不为0则需要进位 - 最后将结果以
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)