这个题解使用了模拟竖式乘法的方法来计算两个字符串表示的数字相乘的结果。具体做法是:
1. 如果其中一个数字是0,直接返回'0'。
2. 创建一个长度为 m+n 的数组 ans 用于存储计算结果的每一位。
3. 从右往左遍历 num1 和 num2 的每个数字,将对应位置的数字相乘,再加上 ans 数组中对应位置的值。
4. 将乘积的个位数存入 ans 数组的 p2 位置,将十位数加到 p1 位置。
5. 遍历完成后,将 ans 数组转换为字符串,并去除前导0(如果有)。
时间复杂度: O(m*n)
空间复杂度: O(m+n)
class Solution:
def multiply(self, num1: str, num2: str) -> str:
# 如果其中一个数字是0,直接返回'0'
if num1 == '0' or num2 == '0':
return '0'
m = len(num1)
n = len(num2)
# 创建一个长度为 m+n 的数组 ans 用于存储计算结果的每一位
ans = [0] * (m+n)
# 从右往左遍历 num1 和 num2 的每个数字
for i in range(m-1, -1, -1):
for j in range(n-1, -1, -1):
# 将对应位置的数字相乘
mul = int(num1[i]) * int(num2[j])
p1 = i + j
p2 = i + j + 1
# 将乘积加上 ans 数组中对应位置的值
s = mul + ans[p2]
# 将十位数加到 p1 位置
ans[p1] += s // 10
# 将个位数存入 p2 位置
ans[p2] = s % 10
# 去除结果的前导0(如果有)
i = 0
while i < len(ans):
if ans[i] != 0:
break
i += 1
# 将结果转换为字符串并返回
return ''.join([str(x) for x in ans[i:]])