python leetcode 字符串相乘实例详解


Posted in Python onSeptember 03, 2018

给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式。

示例 1:

输入: num1 = "2", num2 = "3"

输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"

输出: "56088"

说明:

  1. num1  和  num2  的长度小于110。
  2. num1  和  num2  只包含数字  0-9 。
  3. num1  和  num2  均不以零开头,除非是数字 0 本身。

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

从题目要求来看,应该是让我们实现一个比较省内存的大数乘法,先分享几个我在discuss中发现的不太切合题意的解法:

class Solution:
  def multiply(self, num1, num2):
    """
    :type num1: str
    :type num2: str
    :rtype: str
    """
    return str(eval(num1+'*'+num2))

这个可以说是个毫无技术含量的解法,如果面试的时候掏出这种解法,八成是跪了。

还有很多人使用了以下的解法。

class Solution:
  def multiply(self, num1, num2):
    """
    :type num1: str
    :type num2: str
    :rtype: str
    """
    dict = {'0':0, '1':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9}
    if (num1=='0' or num2=='0'):
      return "0"
    n1 = 0
    n2 = 0
    for c in num1:
      val = dict[c]
      n1 = n1*10 + val
    for s in num2:
      val = dict[s]
      n2 = n2*10 + val
    result = n1 * n2;
    return str(result)

这种解法我觉得还是没有切合题意,将注意力放在的字符串转数字上,乘法还是使用的*。题目要求不能将输入直接转成数字类型,解体人自己实现了int方法完成了字符串的转换,好像是符合要求,但有投机取巧的感觉。

我来分享一下我的解法,思路很简单也很好理解,当我们徒手计算222*11时我们怎么计算呢,肯定是分解成222+2220来计算的,那么我们就可以使用一个一维列表来记录计算结果11分解成10+1,第一轮计算列表的结果为[0, 2, 2, 2],第二轮计算后变为[2, 2+2, 2+2, 2]计算结束。如果需要进位的话,进位的计算放到最后一步。

class Solution(object):
  def multiply(self, num1, num2):
    """
    :type num1: str
    :type num2: str
    :rtype: str
    """
    if num1 == "0" or num2 == "0":
      return "0"
    num1 = num1[::-1]
    num2 = num2[::-1]
    str_list = [0 for _ in range(len(num1)+len(num2))]
    for i in range(len(num1)):
      for j in range(len(num2)):
        str_list[i+j] += (int(num1[i])*int(num2[j]))
    result = ""
    up = 0
    for i in str_list:
      now = i + up
      cur = now % 10
      up = now / 10
      result += str(cur)
    begin = 0
    result = result[::-1]
    for i in result:
      if i == "0":
        begin += 1
      else:
        break
    return result[begin:]
Python 相关文章推荐
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Python随机读取文件实现实例
May 25 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
python matplotlib画图库学习绘制常用的图
Mar 19 Python
Django如何防止定时任务并发浅析
May 14 Python
python 将字符串中的数字相加求和的实现
Jul 18 Python
Python assert语句的简单使用示例
Jul 28 Python
Django框架 querySet功能解析
Sep 04 Python
python使用matplotlib绘制雷达图
Oct 18 Python
python几种常用功能实现代码实例
Dec 25 Python
使用matplotlib的pyplot模块绘图的实现示例
Jul 12 Python
Python+pyftpdlib实现局域网文件互传
Aug 24 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 #Python
Python实现多级目录压缩与解压文件的方法
Sep 01 #Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 #Python
Python pymongo模块常用操作分析
Sep 01 #Python
Python实现提取XML内容并保存到Excel中的方法
Sep 01 #Python
python使用webdriver爬取微信公众号
Aug 31 #Python
python爬取微信公众号文章
Aug 31 #Python
You might like
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
PHP实现权限管理功能示例
2017/09/22 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
JSONP之我见
2015/03/24 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
AngularJS实现用户登录状态判断的方法(Model添加拦截过滤器,路由增加限制)
2016/12/12 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
BootStrap学习笔记之nav导航栏和面包屑导航
2017/01/03 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
js数组去重的方法总结
2019/01/18 Javascript
Javascript Symbol原理及使用方法解析
2020/10/22 Javascript
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
PYTHON发送邮件YAGMAIL的简单实现解析
2019/10/28 Python
python 图片二值化处理(处理后为纯黑白的图片)
2019/11/01 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
Python requests获取网页常用方法解析
2020/02/20 Python
在C语言中"指针和数组等价"到底是什么意思?
2014/03/24 面试题
营业员个人总结的自我评价
2013/10/25 职场文书
农业资源与环境专业自荐信范文
2013/12/30 职场文书
建议书怎么写
2014/03/12 职场文书
好的促销活动方案
2014/08/21 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
学术会议通知范文
2015/04/15 职场文书
详解Oracle块修改跟踪功能
2021/11/07 Oracle