leetcode43:字符串相乘

leetcode43:字符串相乘_第1张图片
思路:显然,并不能进行return str(int(num1)*int(num2))这样的sao操作。
可以模拟乘法的运算过程,即写竖式
对于num1某下标i的数和num2下标为j的数,他们俩相乘的结果对乘积的i+j和i+j+1两个位置(从乘积的高位起为0),例子如下:

leetcode43:字符串相乘_第2张图片
leetcode43:字符串相乘_第3张图片
从图中可以看出,num1第1位置的2和num2第0位置的4相乘为08.,影响最终结果的第1和第2位,则把结果累加到这两位即可。注意累加的时候,低位加余数,高位加模(如3*5=15,则高位加1,低位加5)。最后再考虑是否进位,并剔除高位的0。
代码如下:

class Solution:
    def multiply(self, num1, num2):
        # num1 = int(num1)
        # num2 = int(num2)
        # return str(num1*num2)
        if num1 == '0' or num2 == '0':
            return '0'
        res = [0 for i in range(len(num1)+len(num2))]         #初始化一个与结果等长的数组,数组中的每个元素都为0
        for i in range(len(num1)-1,-1,-1):
            for j in range(len(num2)-1,-1,-1):
                tmp = (ord(num1[i])-ord('0')) * (ord(num2[j])-ord('0'))      #两数组任意两元素相乘
                res[i+j] += int(tmp / 10)        #高位加模
                res[i+j+1] += tmp % 10           #低位加余数
        for i in range(len(res)-1,0,-1):
            carry = res[i]//10           #判断是否需要进位
            if carry > 0:
                res[i] = res[i]%10       #if需要进位,则本位取余数,高位加上进位数
                res[i-1] += carry
        res = ''.join(str(x) for x in res).lstrip('0')        #剔除高位的0
        return res

你可能感兴趣的:(刷题,Python,leetcode)