【LeetCode】43.字符串相乘--Python

题目描述
  给定以字符串形式比表示的非负整数num1和num2,返回num1和num2的乘积的字符串形式。
  例如num1=“123”,num2=“456”
  输出:“56088”
分析
  这类涉及乘法的问题要考虑数字界限,但对于Python来说,大数完全没问题。可以直接return str(int(num1)*int(num2)),但是对于我们这些有追求的人 老实人,还是要考虑一下界限问题。思路是这样的,我们需要考虑平时手算乘法的过程,例如:

1 2 3
×  6
---------------------
  1  8
 1 2 0
 6 0 0
---------------------
= 7 3 8
  以上计算过程,也就是计算3×6+20×6+100×6,所以我们只要把num1和num2存到列表中,然后在对应位置上给乘积补对应的0就可以了。

代码

def multiply(num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
num1 = list(num1)
num1 = list(map(int, num1))
num2 = list(num2)
num2 = list(map(int, num2))
len1 = len(num1)
len2 = len(num2)

以上首先把字符串转变成数字列表,“123”变[1,2,3],并且获取每个列表的长度方便遍历。

for i in range(len1):
    partition = 0
    for j in range(len2):
        index1 = len1 - i - 1
        index2 = len2 - j - 1
        partition += num1[index1] * num2[index2] * (10 ** (len2 - index2 -1))
    num += partition* (10 ** (len1 - index1 -1))
return str(num)

以上for循环是分析中计算过程的实现,(10 ** (len2 - index2 -1)是补0的操作。另外,许多代码就在这一步return了计算出的num。但从我的角度来看,我觉得不对。以列表的方式做乘法计算,就是为了防止数字过大,而以上代码本质上还是计算了一个很大的num,然后转换成str,这和return str(int(num1)*int(num2))没什么区别。我的做法是,把每一个partition存在列表中,再把他们存在num_matrix中。那么num_matrix就是[partition_1,partition_2,…,partition_n]。partition是什么呢?例如123×456,partition1 = 456×3,partition2=456×20,partition3=456×100。最后我们得到了三个partition分别是[7,3,8],[6,1,5,0],[4,9,2,0,0],把它们以列表的形式(没有大数)相加就是最终结果。以下是完整代码。

def multiply(num1, num2):
    """
    :type num1: str
    :type num2: str
    :rtype: str
    """
    num1 = list(num1)
    num1 = list(map(int, num1))
    num2 = list(num2)
    num2 = list(map(int, num2))
    len1 = len(num1)
    len2 = len(num2)
    num_matrix = []
    num = 0
    for i in range(len1):
        partition = 0
        for j in range(len2):
            index1 = len1 - i - 1
            index2 = len2 - j - 1
            partition += num1[index1] * num2[index2] * (10 ** (len2 - index2 -1))
        # num += partition* (10 ** (len1 - index1 -1))
    # return str(num)
        partition = map(int,str(partition))
        for k in range(0,i):
            partition.append(0)
        num_matrix.append(partition)


    max_len = len(num_matrix[len(num_matrix) - 1])

    for i in range(len(num_matrix)):
        num_matrix[i].reverse()
        while len(num_matrix[i]) < max_len:
            num_matrix[i].append(0)
    total = [0 for i in range(max_len)]
    add = 0
    for i in range(max_len):
        for j in range(len(num_matrix)):
            total[i] += num_matrix[j][i] + add
            if add:
                add = 0
        add = total[i] / 10
        total[i] = total[i] % 10
    if add:
        total.append(add)

    total.reverse()
    total = map(str,total)
    total = ''.join(total)

    if total.count('0') == len(total):
        return '0'

    return total

if __name__ =='__main__':
    num1 = '123456789'
    num2 = '987654321'
    print multiply(num1,num2)

我的代码就像老奶奶的裹脚布,又臭又长。
最后
【LeetCode】43.字符串相乘--Python

上一篇:43-Kruskal 算法


下一篇:Python3网络爬虫实战-43、极验滑动验证码的识别