LeetCode Multiply Strings
2016-01-06 10:04
411 查看
LeetCode解题之Multiply Strings
原题
将两个用字符串表示的数进行乘法操作并返回字符串结果。注意点:
给的数是非负整数
数字可以无穷大
例子:
输入: num1 = “123”, num2 = “20”
输出: “2460”
解题思路
根据笔算乘法的公式来看,乘法操作分解开来其实就是先进行每个位的乘法操作,然后将所有结果进行加法操作。首先明确一个m位的数乘以一个n位的数做多为m+n位(都是9的时候试一下)。其次后面的0相等的数在相加时是末尾对齐的。如123×456,我们可以看到1×6、2×5和3×4在进行加法的时候是末尾对齐的,我们可以在进行第一轮乘法的时候将这些数先加起来,而后面的零通过在列表中的位置来表示。再用一个循环进行进位加法,最后把开头多余的0去掉。具体步骤看下面的例子:[code]123*456 100 400 20 50 3 6 [3*6, 2*6+3*5, 1*6+2*5+3*4, 2*4+1*5, 1*4, 0] [18, 27, 28, 13, 4, 0] [8, 27+1, 28, 13, 4, 0] [8, 8, 28+2, 13, 4, 0] [8, 8, 0, 13+3, 4, 0] [8, 8, 0, 6, 5, 0] "880650"-->"056088" "56088"
AC源码
[code]class Solution(object): def multiply(self, num1, num2): """ :type num1: str :type num2: str :rtype: str """ num1 = num1[::-1] num2 = num2[::-1] length1 = len(num1) length2 = len(num2) temp = [0 for __ in range(length1 + length2)] # Do multiply for i in range(length1): for j in range(length2): temp[i + j] += int(num1[i]) * int(num2[j]) carry = 0 digits = [] # Do plus for num in temp: s = carry + num carry = s // 10 digits.append(str(s % 10)) result = "".join(digits)[::-1] # Remove the surplus zero sub_index = 0 for i in range(length1 + length2 - 1): if result[i] == "0": sub_index += 1 else: break result = result[sub_index:] return result if __name__ == "__main__": assert Solution().multiply("120", "20000") == 2400000 assert Solution().multiply("0", "3421") == 0
欢迎查看我的Github来获得相关源码。
相关文章推荐
- 山东大学计算机网络复习纲要
- 高精度进制转换
- 良好的编码规范
- Ado.net 类扩展属性
- JAVA 软件升级版本号比较
- GTONE上安装插件无法显示SecurityPrism菜单
- Jenkins with XCode 持续化集成(原创)
- hdu 3790 最短路
- 字符串切割字符需要转译
- nodejs安装supervisor
- UITextFiedl 左侧设置小图标 leftview
- Java多线程基础
- android 监听Home键和亮灭屏
- Unable to run mksdcard SDK tool
- Spring+MyBatis多数据源配置实现
- ganglia 报 "Error 1 sending the modular data for" Error解决方法
- 美团推荐算法实践
- 强烈推荐一个pomelo程序设计伴侣
- KETTLE集群搭建
- git tag操作教程