前往此题

解题思路

模拟法

将被乘数num1去乘以从右往左遍历的乘数num2每一位数字,当然也要记得除了最低位,其余位都要补0,最后将乘积进行累加就是最终结果。

算法过程

  1. 创建变量ans作为最终的结果,carry作为在做乘法时用于标记进位
  2. 因为要考虑到乘法运算对十位数以上的运算要保留0,所以在运算过程中需要创建变量curr来保存乘法结果并保留0
  3. 按照乘法运算规则,从被乘数的末尾开始遍历到头部,对乘数的每一位进行乘法运算,将每次的运算结果放入到curr中,注意进位符carry
  4. 最后将curr中保存的数字进行求和,求和方式参照415.字符串相加来解决

细节分析

  1. 在每次对被乘数的每一位进行乘法运算的时候需要考虑到非最低位数的结果需要在末尾保留0,保留多少个0与该位数的所在位置有关。通过curr = ['0'] * (n - i - 1)来初始化。
class Solution:
    # 将单个乘积结果放入数组curr
    def multiply(self, num1: str, num2: str) -> str:
        if num1 == '0' or num2 == '0': return '0'

        m, n = len(num1), len(num2)
        ans = '0'

        for i in range(n-1, -1, -1):
            carry = 0
            y = int(num2[i])
            curr = ['0'] * (n - i - 1)
            for j in range(m-1, -1, -1):
                p = int(num1[j]) * y + carry
                curr.append(str(p % 10))
                carry = p // 10
            if carry > 0:
                curr.append(str(carry))
            curr = ''.join(curr[::-1])
            ans = self.addStrings(ans, curr)
        return ans
    

    def addStrings(self, num1, num2):
        i, j = len(num1) - 1, len(num2) - 1
        carry = 0
        ans = []

        while i >= 0 or j >= 0 or carry != 0:
            x = int(num1[i]) if i >= 0 else 0
            y = int(num2[j]) if j >= 0 else 0

            result = x + y + carry
            ans.append(str(result % 10))
            carry = result // 10

            i -= 1
            j -= 1
        return ''.join(ans[::-1])