43. 字符串相乘(Python)

更多精彩内容,请关注【力扣中等题】

题目

难度:★★★☆☆
类型:数学
方法:暴力求解

解答

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

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

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

说明
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解答

虽然实现“str(int(num1)*int(num2))”很方便快捷,但是还是有必要知道怎么做的,这里没有涉及任何int类型计算,还原小学课堂的原始体验。

小学一年级和三年级分别要背两个字典:
加法字典:{(加数1,加数2,上一步的进位):(两数之和,进位)}
乘法字典:{(因数1,因数2):乘积}

按照要求分别实现下面几个功能函数:

  1. 两数相加;
  2. 多个数字相加;
  3. 多位数乘一位数;
  4. 多位数乘多位数。
class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        add_result = {(str(i), str(j), str(c)): (str((i + j + c) % 10), str((i + j + c) // 10)) for i in range(10) for j in range(10) for c in range(2)}

        mul_result = {(str(i), str(j)): str(i*j).zfill(2) for i in range(10) for j in range(10)}

        def two_sum(num1: str, num2: str) -> str:
            max_len = max(len(num1), len(num2))
            num1, num2 = num1.zfill(max_len), num2.zfill(max_len)
            res, carry = '', '0'
            for str1, str2 in reversed(list(zip(num1, num2))):
                sum_tmp, carry = add_result[(str1, str2, carry)]
                res = sum_tmp + res
            res = carry + res if carry == '1' else res
            return res

        def n_sum(nums):
            res = '0'
            for num in nums:
                res = two_sum(res, num)
            return res

        def mul_num_bit(digits, digit):
            """
            Multiply multiple digits with one digit.
            :return: 
            """
            res, carry = '', '0'
            for bit in reversed(digits):
                mul_res = mul_result[(bit, digit)]
                mul_res = two_sum(mul_res, carry)
                carry, mul_tmp = mul_res[0], mul_res[1]
                res = mul_tmp + res
            res = carry + res if carry != '0' else res
            return res

        def two_multiply(num1: str, num2: str):
            res = []
            num2 = num2[::-1]
            for i in range(len(num2)):
                cur_mul = mul_num_bit(num1, num2[i]) + '0' * i
                res.append(cur_mul)
            res = n_sum(res)
            return '0' if set(res) == {'0'} else res

        return two_multiply(num1, num2)

如有疑问或建议,欢迎评论区留言~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容