目录

0043:字符串相乘(★)

力扣第 43 题

题目

给定两个以字符串形式表示的非负整数 num1num2,返回 num1num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1num2 只能由数字组成。
  • num1num2 都不包含任何前导零,除了数字0本身。

分析

不能直接转为整数,考虑模拟竖式乘法:

  • 结果最多 m * n 位,用 m * n 长度的数组存储结果
  • 对于每对 <nums1[i], nums2[j]>, 乘积结果对应第 i+j 和 i+j+1 位
  • 从低位到高位遍历,遍历过程中注意进位
  • 注意最后要去掉前置 0,且注意结果为 0 的情况

解答

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        m, n = len(num1), len(num2)
        res = [0]*(m+n)
        for i in range(m-1,-1,-1):
            for j in range(n-1,-1,-1):
                a,b = int(num1[i]),int(num2[j])
                q,res[i+j+1] = divmod(res[i+j+1]+a*b,10)
                res[i+j] += q
        return ''.join(map(str,res)).lstrip('0') or '0'

112 ms