leetcode 总结 08 大数相加

leetcode 08 大数相加

就最近遇到一个比较有特点的题,特点大数这个东西第一次听说这么搞。

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

提示:

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

因为给出的大数是 字符串,考虑到需要逆序,比较容易的方式在自己了解不多的语言中认为 Python 比较好用,因为字符串逆序和字符串分割为数组会比较简单。于是就这么干了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution:
def addStrings(self, num1: str, num2: str) -> str:
#翻转 总是要每一位相加的,相加也需要有进位,从最低位到最高位
num_revert_1 = num1[::-1]
num_revert_2 = num2[::-1]
len_1 = len(num1)
len_2 = len(num2)
#取出最大长度数组和最短长度
max_len = len_1 if len_1 > len_2 else len_2
mini_len = len_1 if len_1 < len_2 else len_2

max_str_rever = num_revert_1 if max_len == len_1 else num_revert_2
mini_str_rever = num_revert_1 if mini_len == len_1 else num_revert_2
# 如果长度相等,那么无所谓长短
if max_len == mini_len:
max_str_rever = num_revert_1
mini_str_rever = num_revert_2

# 相加 给一个返回值用于返回,初始值为空
return_str = ""
need_add = 0 # 标识位,用来标识当前相加是否需要进位
for i in range(max_len):
# 每次相加的数字暂存 , 当数组长度不一致时候,在比较小的长度时候是两个数组相加 , 超过了这个长度就是最大长度的数组自身数值
tmp_add = (int(max_str_rever[i]) + int(mini_str_rever[i])) if (i < mini_len) else (int(max_str_rever[i]))
# 其实tmp_add 基本就差不多能决定下一次是否需要进位了 , 可是别忘了还有进位 , 因为进位是个位,所以下面怎么写都行 tmp_add 不可能大于18 , need_add 不可能大于 1
second_add = tmp_add % 10 + need_add # 加上进位之后的个位数, 也有可能是 10 比如 tmp_add = 9 , need_add = 1
return_str += str(second_add % 10) # 所以取余 个位数
need_add = 1 if (second_add >= 10 or tmp_add >= 10) else 0 # 如果 second_add >= 10 或者 第一次相加都 >= 10 那么就进位
#如果到最后发现进位标识符还是 1, 那么最高位再补一个 1
if need_add == 1:
return_str += '1'
#最后内容翻转就是我们需要输出的
return return_str[::-1]