1. 原始题目
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3" 输出: "6"
示例 2:
输入: num1 = "123", num2 = "456" 输出: "56088"
说明:
num1
和num2
的长度小于110。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字 0 本身。- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
2. 思路
对于两个长为num1和num2的整数相乘,结果最长为num1+num2,所以先初始化这样长的一个数组。然后可以看到建立两个循环来存放每个索引的结果,当前的两个数字相乘后会在数组的两个位置产生结果。即商和余数。依次便利即可。存放完成后再对数组进行一边处理,因为有的位置可能>9,需要再进位至前一位。如果开头是0的话要删除。如果全0数组只返回”0“即可。
3. 实现
1 class Solution:
2 def multiply(self, num1: str, num2: str) -> str:
3 res = [0]*(len(num1)+len(num2))
4 for i in range(len(num1)-1, -1, -1): # 2,1,0
5 for j in range(len(num2)-1, -1, -1): # 1,0
6 temp = int(num1[i])*int(num2[j])
7 res[i+j+1] += temp%10 # 更新第一个索引位置
8 res[i+j] += temp // 10 # 更新第二个索引位置
9 for i in range(len(res)-1,-1,-1): # 将数组在遍历一遍更新>9的数,进位
10 if res[i]>9:
11 res[i-1]+=res[i]//10
12 res[i] = res[i]%10
13 res = ''.join([str(s) for s in res]).lstrip('0') # 删掉开头的0
14 if not res: return '0' # 如果全0的话只返回"0"就好
15 return res