字符串相乘 题解

Leetcode 43题, 字符串相乘题解 时间复杂度: O(N*M) 空间复杂度: O(N+M)

Leetcode 43题

思路

由小学知识, 我们可以通过列竖式计算乘法

e.g. 1234 x 567

(突然发现617多打了个0, 不过无所谓了, 我懒得改了)

不难注意到, 竖式计算就是先计算一位数乘以多位数的结果然后再将其相加

还是以1234 x 567为例, 可转化为 1234 x 7 + 1234 x 60 + 1234 x 500

最后在这里将结果汇总 (多简单的小学乘法, 对吧?)

也就是说我们可以使用list存储数位, 乘了以后存储到其中

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        # 逆序
        num1 = list(int(i) for i in num1)[::-1]
        num2 = list(int(i) for i in num2)[::-1]
        # 结果存储, 长度为两数相乘结果最大长度
        Res = [0] * (len(num1) + len(num2))

接下来一位一位乘, 以及进位 (十位加到下一位, 只保留个位)

for i in range(len(num2)):
   for a in range(len(num1)):
      Res[a + i] += num1[a] * num2[i]   # 这里a + i的原因是因为数位变动, 补0
   while max(Res) > 9:   # 是否都进位完
      for a in range(len(Res)):
         if Res[a] > 9:
            Res[a + 1] += Res[a] // 10
            Res[a] %= 10

返回结果 (反转, 去前导0)

Res.reverse()
while Res and Res[0] == 0:
   Res.pop(0)
return ''.join(str(i) for i in Res) or '0'

完整代码

class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        num1 = list(int(i) for i in num1)[::-1]
        num2 = list(int(i) for i in num2)[::-1]
        Res = [0] * (len(num1) + len(num2))
        for i in range(len(num2)):
            for a in range(len(num1)):
                Res[a + i] += num1[a] * num2[i]
            while max(Res) > 9:
                for a in range(len(Res)):
                    if Res[a] > 9:
                        Res[a + 1] += Res[a] // 10
                        Res[a] %= 10
        Res.reverse()
        while Res and Res[0] == 0:
            Res.pop(0)
        return ''.join(str(i) for i in Res) or '0'

复杂度

时间复杂度O(N∗M)

空间复杂度O(N+M)

LICENSED UNDER CC BY-NC-SA 4.0
Comment