题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
例:
输入: num1 = "123", num2 = "456"
输出: "56088"
方法
- 若两个数字其中有一个为零,那么乘积一定为零
- m 表示字符串 num1 的长度,n 表示字符串 num2 的长度
- result 记录两个数字相乘后的结果,长度为 m+n
※ 原因: 乘积的长度取决于两个乘数的长度。
若两个乘数均取该长度的最小值,即 num1 = 10^(m-1) 和 num2 = 10^(n-1),那么二者乘积为 num1×num2 = 10^(m+n-2),最终得到乘积的长度 m+n-1
若两个乘数均取该长度的最大值,即 num1 = 10^m - 1 和 num2 = 10^n - 1,那么二者乘积为 num1×num2 = 10^(m+n) - 10^m - 10^n + 1,该乘积的大小为小于 10^(m+n) 但大于 10^(m+n-1),最终得到乘积的长度最大值 m+n - 模拟乘法的竖式,从个位数开始相乘,将每两个数 i 和 j 相乘的结果存入 result 的相应位置 i+j+1 中
- 因为两数相乘可能会导致进位,那么需将该进位加至前一位,并更新该位的数字
- 若首位为零,那么需从下一位开始组成字符串;否则,直接组成字符串
class Solution(object):
def multiply(self, num1, num2):
if num1 == '0' or num2 == '0':
return '0'
m, n = len(num1), len(num2)
result = [0] * (m+n)
for i in range(m-1, -1, -1):
for j in range(n-1, -1, -1):
result[i+j+1] += int(num1[i]) * int(num2[j])
for i in range(m+n-1, 0, -1):
result[i-1] += result[i] // 10
result[i] %= 10
if result[0] == 0:
return ''.join(str(i) for i in result[1:])
else:
return ''.join(str(i) for i in result)
报错
-
sequence item 0: expected string, int found:
string.join connects elements inside list of strings, not ints.
''.join(str(v) for v in value_list)
参考
代码相关:https://leetcode.cn/problems/multiply-strings/solution/zi-fu-chuan-xiang-cheng-by-leetcode-solution/
报错:https://stackoverflow.com/questions/10880813/typeerror-sequence-item-0-expected-string-int-found