leetcode415. 字符串相加
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和。
注意:
- num1 和num2 的长度都小于 5100.
- num1 和num2 都只包含数字 0-9.
- num1 和num2 都不包含任何前导零。
- 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
方法:双指针
思路:
不能直接将字符串转为整数,我们直接使用小学算术的方式,从后到前,将每一位字符转换为数字,相加,记录是否进位,然后答案转换为字符保存。
我们使用双指针,一个指向num1,一个指向num2,首先指向最后一位,将两个指针指向的字符转换为数字相加(如果不能用直接转化的方法,可以使用ASCII码,转换为int),记录是否进位flag,两个指针都向前移动,当其中有一个指针到了最左边之后,这个数相加完了,之后只需要考虑另一个数;两个指针都结束,判断flag,如果flag=1,说明有进位,将答案+'1',最后将答案翻转,即为最后的答案。
代码:
class Solution:
def addStrings(self, num1: str, num2: str) -> str:
n1 = len(num1)
n2 = len(num2)
#p1、p2指向两个字符串的最后一位
p1 = n1-1
p2 = n2-1
ans = ''
flag = 0
#当至少一个指针>=0,就还没结束
while p1>=0 or p2>=0:
#temp保存这一位的结果
temp = 0
if p1>=0:
temp += int(num1[p1])
p1 -= 1
if p2>=0:
temp += int(num2[p2])
p2 -= 1
#加上上一位的进位
temp += flag
#如果和大于等于10,需要进位
flag = 1 if temp >= 10 else 0
#转换为字符形式加入答案
ans += str(temp%10)
#最后如果需要进位,加上字符'1'
if flag == 1:
ans += '1'
#翻转字符串即为答案,
return ans[::-1]
结果:
![d163eb8377e5e89c662cef51bf4a8cb0.png](https://i-blog.csdnimg.cn/blog_migrate/be7873dc4a6b36b224fc41cf12cad8e8.png)