目录
- 题目
- 答案
- 运行结果
题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
答案
数学乘法模拟
假设 num1 和 num2 的长度分别为 m 和 n,则它们的乘积的长度最多为 m+n。
证明如下:
- 如果 num1 和 num2 都取最小值,那么它们的乘积为 10 m−1 ×10 n−1 =10 m+n−2 ,长度为 m+n−1。
- 如果 num1 和 num2 都取最大值,那么它们的乘积为 (10 m −1)×(10 n −1)=10 m+n −10 m −10 n +1,长度为 m+n。
因此,我们可以申请一个长度为 m+n 的数组,用于存储乘积的每一位。
从低位到高位,依次计算乘积的每一位,最后将数组转换为字符串即可。
注意判断最高位是否为 0,如果是,则去掉。
时间复杂度 O(m×n),空间复杂度 O(m+n)。其中 m 和 n 分别为 num1 和 num2 的长度。
class Solution(object):def multiply(self, num1, num2):""":type num1: str:type num2: str:rtype: str"""if num1 == "0" or num2 == "0":return "0"m, n = len(num1), len(num2)arr = [0] * (m + n)for i in range(m - 1, -1, -1):a = int(num1[i])for j in range(n - 1, -1, -1):b = int(num2[j])arr[i + j + 1] += a * bfor i in range(m + n - 1, 0, -1):arr[i - 1] += arr[i] // 10arr[i] %= 10i = 0 if arr[0] else 1return "".join(str(x) for x in arr[i:])