字符串 大数相乘

https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1015/

给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

思路是模拟普通计算乘法的流程,不断地迭代每一位数字。
其中会用到

  1. 两个数相乘的结果,不超过两个数位数相加之和,可初始化一个长度为两者相加,数据都为0的数组result。
  2. 对于相乘的两个数,第一个数的每一位只会影响对应结果的对应位置。如12*34,对于12来说,2会影响结果的个位,1会影响结果的十位,不会影响结果的个位。
  3. 不停的对两个num进行循环,并且将其对每一位的影响都加到result。注意for循环中,都需要是+=,并且两位相乘的时候,最大也就是9*9=81,只会影响当前位和前面一位,不会影响再前面的位置了。
  4. 最后对result去除前面的0即可
class Solution(object):
    def multiply(self, num1, num2):
        """
        :type num1: str
        :type num2: str
        :rtype: str
        """
        if num1 == '0' or num2 == '0':
            return '0'
        
        result = [0] * (len(num1)+len(num2))
        num1_rev = num1[::-1]  # 切片将数组逆序
        num2_rev = num2[::-1]
        
        pos = len(num1) + len(num2) - 1 # 相当于取出个位数
        
        for i in num1_rev :
            tmp_pos = pos # num1_rev已经逆序了,个位数只影响个位
            
            for j in num2_rev:
                result[tmp_pos] += int(i) * int(j)
                result[tmp_pos-1] += result[tmp_pos] // 10  # 整除10取商
                result[tmp_pos] = result[tmp_pos] % 10 
                tmp_pos -= 1
            pos -= 1
        
        zero_pos = 0
        for i in range(0,len(result)):
            if result[i]!=0:
                break
            zero_pos += 1
        
        result_str = [str(i) for i in result[zero_pos:]]
        return ''.join(result_str)

你可能感兴趣的:(字符串 大数相乘)