字符串相乘

来自LeetCode43

  • 题目如下在这里插入图片描述
  • 普通方法:基于竖式的计算(图片来自breezean答案在这里插入图片描述
  • 优化方法:对竖式计算进行优化,如图(图片来源同上)
    • 该方法说的是,num1和num2从左到右index,即左边第一位的index为0,依次类推;
    • num1、num2设分别有N、M位,则乘积结果RES的位数最多是N+M位;
    • 如下图所示,如果num1的第i位(index i)乘以num2的第j位(index j),会得到一个至多两位的数,即为ab,a可能为0;而a在RES中的index是第i+j位,b在RES中的index是第i+j+1位;
    • 下图举例,2*4=08,0在RES的第 i+j=1+0=1 位,8在RES的第 i+j+1=0+1+1=2 位;
    • 由此,只要对num1、num2遍历相乘,把得到的两位数结果分别累加到RES相应的位上,最后整理一次进位,即可得到乘积RES,再以字符串输出即可;
      在这里插入图片描述
  • 代码如下:
	class Solution:
    def multiply(self, num1: str, num2: str) -> str:
        """
        方法:
            竖式计算的快捷方法
            num1的N位数*num2的M位数 结果res最多有N+M位;
            从左往右做index(首位0),num1的第i位和num2的第j位相乘,
            得到的两位数记为0y或者xy,
            该两位数的第一位在res中的index为i+j,
            第二位的index为i+j+1
        """
        if not num1 or not num2 or len(num1)==0 or len(num2)==0:
            return None
        if num1 == "0" or num2 == "0":  # 容易漏掉
            return "0"
        len_num1 = len(num1)
        len_num2 = len(num2)
        res = [0] * (len_num1 + len_num2)  # N+M位,用于累加
        for i in range(len_num1):
            int1 = ord(num1[i]) - ord("0")  # 字符串转成整数
            for j in range(len_num2):
                int2 = ord(num2[j]) - ord("0")
                res_tmp = int1 * int2
                res[i+j] += res_tmp // 10  # 十位
                res[i+j+1] += res_tmp % 10  # 个位

        for ix in range(len(res)-1, -1, -1):  # 整理进位
            if res[ix] > 9:
                res[ix-1] += res[ix] // 10  # 注意要先计算进位
                res[ix] = res[ix] % 10
                
        res = [str(r) for r in res]  # 转成字符串
        return "".join(res) if res[0] != "0" else "".join(res[1:])
  • 总结:
    • 主要是竖式计算优化技巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值