原题链接Multiply Strings

意思是给两个字符串,代表两个整数,求这两个整数的积,以字符串的形式返回
主要注意的地方在这两个字符串可能很长,远远超过了long long int所表示的范围,所以当初耍小聪明直接用std::stringstream获取两个整数再相乘就果断的溢出了


所以这种问题还是实打实的用字符串计算比较好,当然需要点技巧,算法题很少用蛮力法硬算的…
首先还是找规律,对于字符串1的某一位乘字符串2的某一位,乘积的结果在整个结果的哪一位呢,能不能找到某种规律直接定位,这样就简单多了。
先看一下乘法运算

/* 以下a * b表示num1[a] * num2[b] */
                    num1[0]        num1[1]        num1[2]
            *       num2[0]        num2[1]        num2[2]
--------------------------------------------------0 * 2          1 * 2          2 * 20 * 1       1 * 1          2 * 1
0 * 0     1 * 0       2 * 0
----------------------------------------------------------

上式中直接用下标代表对应位的值,乘号左边代表num1的值,右边代表num2的值,比如0 * 1代表num1[0] * num2[1]
注意这里,0*0中0+0=0,正好是结果的第0位,0*1中0+1=1,1*0中1+0=1刚好是结果的第1位
所以根据下标很容易定位到结果的位置
又因为0*0可能会进位,所以在结果中每一位都后移一位,即0*0是第1位….,第0位用来存最后的进位
这样代码就容易写出了

class Solution {
public:string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0")return "0";int n1 = num1.size();int n2 = num2.size();string res(n1 + n2, '0');for(int i = n1 - 1; i >= 0; --i){for(int j = n2 - 1; j >= 0; --j){int lhs = num1[i] - '0';int rhs = num2[j] - '0';/* 这里要注意的问题时,当把进位加给res[i+j]时,res[i+1]仍然可能继续向高位进位 *//* 但是不需要直接处理这种情况,在下次处理到res[i+j]时,一定会将进位进到高位 *//* 因为res[i+j]一定在res[i+j+1]后面处理 */int num = lhs * rhs + (res[i + j + 1] - '0');res[i + j + 1] = (num % 10) + '0';res[i + j] = res[i + j] + num / 10;}}/* 比如两个3位数相乘结果位数可能是5位或6位,6位时是次高位向高位有进位,此时res中没有前导0 *//* 而5位时说明没有进位,那么res[0]将是0,结果应该把这个前导0去掉,因为初始时res设成6位 */return res.substr(res.find_first_not_of('0'));}
};

每天一道LeetCode-----字符串乘法相关推荐

  1. python中字符串乘法_python leetcode 字符串相乘实例详解

    给定两个以字符串形式表示的非负整数 num1 和  num2 ,返回  num1 和  num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  2. atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  3. 每日一道leetcode(python)844. 比较含退格的字符串

    每日一道leetcode(python)844. 比较含退格的字符串 2021-09-05 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表 ...

  4. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  5. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  6. 每日一道 LeetCode (16):求 x 的平方根

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  7. 一天一道LeetCode(61-90)

    一天一道LeetCode(61-90) 文章目录 一天一道LeetCode(61-90) 61.旋转链表 62.不同路径 63.不同路径 II 64.最小路径和 65.有效数字(未解决) 66.加一 ...

  8. 【一天一道Leetcode】基本计算器的延伸问题

    本篇推文共计2000个字,阅读时间约3分钟. 01 题目描述 题目描述: 给你一个字符串表达式s,请你实现一个基本计算器来计算并返回它的值. 整数除法仅保留整数部分. 示例: 输入:s = " ...

  9. 七十二、Python | Leetcode字符串系列(下篇)

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  10. 七十一、Python | Leetcode字符串系列(上篇)

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. Spring源代码解析(十):Spring Acegi框架授权的实现
  2. 谈谈CListCtrl如何调整行高
  3. carsim学习笔记5——carsim与simulink联合仿真
  4. PulseAudio 设计和实现浅析
  5. 初识Mysql(part18)--我需要知道的4个关于联结的小知识点
  6. Derby的jar说明
  7. foss测试_FOSS的业务真的是社区软件吗?
  8. 除手机平板PC外 华为终端明年全线搭载鸿蒙系统
  9. php foreach 单箭头,PHP Foreach循环具有单个元素
  10. 6. DICOM图像显示-DCMTK-像素数据获取的三种方式和源码分析
  11. 《嵌入式 – GD32开发实战指南》第10章 串口通信
  12. java jmail_JavaMail学习--使用JMail发送邮件
  13. yaml使用方法_通过网络使用YAML
  14. VS2008创建C++项目
  15. 读书笔记10 《蔡康永的说话之道1》 蔡康永
  16. mysql 复制frm_如何通过直接复制frm文件以实现恢复/复制innodb数据表
  17. 针对 DNS 监控的 Grafana Dashboard面板DeepFlow
  18. 提取DWG图纸中的图元信息
  19. Tripleo之nova-compute 和Ironic的代码深入分析(三)
  20. 蓝汛之获取DAC输出能量【篇】

热门文章

  1. 显卡在电脑什么位置_告诉你什么配置的电脑显卡/GPU才能播放4K电影视频
  2. C语言学习之输入两个正整数m和n,求其最大公约数和最小公倍数。
  3. try、catch、finally的执行顺序
  4. 实验吧逆向catalyst-system——WP
  5. Python学习之 !/usr/bin/python 和 !/usr/bin/env python区别
  6. Eclipse中tomcat更改部署路径 deply path
  7. 主从复制1062错误的解决方法
  8. Myeclipse10下载,安装,破解,插件,优化介绍.
  9. OpenGL ES之深入解析如何实现“手写绘画板”
  10. iOS之身份证号码全校验与校验位自动补全