目录

  • 1、题目
  • 2、思路
  • 3、c++代码
  • 4、java代码

1、题目

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

示例 1:

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

示例 2:

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

说明:

  1. num1num2 的长度小于110
  2. num1num2 只包含数字 0-9
  3. num1num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

2、思路

(字符串模拟) O(n∗m)O(n*m)O(n∗m)

普通竖式

num1 = 123 , num2 = 456为例:我们遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加,在这个过程如果相乘或者相加的结果大于等于10 ,我们都要去满10进位,如下图所示:

这样模拟普通竖式计算的方法较为复杂,我们可以考虑优化版的竖式计算。

优化竖式

其实在相乘或者相加计算过程的每一位,我们可以考虑先不去满10进位,等到计算完所有的相乘结果以后,最终将其加到一块,再去满10进位 ,最后的结果和普通竖式 一样,但却可以大大简化我们的模拟过程。(如下图所示)

具体过程如下:

  • 1、长度是n和长度是m的数字相乘,最多只有n + m位,为了方便计算,将num1num2反向存储到A[]B[]中,即位数低的在数组前面,且开一个大小是n + mC[]存储计算后的答案。
  • 2、两个数相乘时,将A[i] * B[j]的结果累加到C[i + j]中,最后C[i + j]表示i + j这个位数的值是C[i + j](如上图所示)
  • 3、由于C[]数组中的某些位数字可能是大于等于10的,我们从0枚举到n + m - 1,进行满10进位, 将所有位的值全部变成个位数。
  • 4、最后将C[]数组反转输出。

细节:

  • 最终得到的数组C[]的高位可能包含前导0,因此在反转之前要先去除高位前导0

时间复杂度分析: O(n∗m)O(n*m)O(n∗m),nnn和mmm分别是num1num1num1和num2num2num2的长度。

3、c++代码

class Solution {public:string multiply(string num1, string num2) {vector<int> A, B;int n = num1.size(), m = num2.size();for (int i = n - 1; i >= 0; i -- ) A.push_back(num1[i] - '0'); //反向存贮for (int i = m - 1; i >= 0; i -- ) B.push_back(num2[i] - '0');vector<int> C(n + m);for (int i = 0; i < n; i ++ )for (int j = 0; j < m; j ++ )C[i + j] += A[i] * B[j];int t = 0;  //存贮进位for (int i = 0; i < C.size(); i ++ ) {t += C[i];C[i] = t % 10;t /= 10;}int k = C.size() - 1;while (k > 0 && !C[k]) k -- ;  //去除前导0string res;while (k >= 0) res += C[k -- ] + '0';  //反转return res;}
};

4、java代码

class Solution {public String multiply(String num1, String num2) {int n = num1.length(), m = num2.length();int[] A = new int[n], B = new int[m];for (int i = n - 1; i >= 0; i--) A[n - 1 - i] = num1.charAt(i) - '0';for (int i = m - 1; i >= 0; i--) B[m - 1 - i] = num2.charAt(i) - '0';int[] C = new int[n + m];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)C[i + j] += A[i] * B[j];int t = 0;for (int i = 0; i < C.length; i++) {t += C[i];C[i] = t % 10;t /= 10;}int k = C.length - 1;while (k > 0 && C[k] == 0) k--;StringBuilder sb = new StringBuilder();while (k >= 0) sb.append((char)(C[k--] + '0'));return sb.toString();}
}

原题链接: 43. 字符串相乘

LeetCode 43. 字符串相乘【c++/java详细题解】相关推荐

  1. leetcode -43 -字符串相乘 -java版

    文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...

  2. LeetCode 43字符串相乘44通配符匹配

    原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...

  3. LeetCode 43. 字符串相乘(大数乘法)

    文章目录 1. 题目 2. 小学竖式乘法 2.1 普通版 2.2 优化版 1. 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示 ...

  4. leetcode 43. Multiply Strings | 43. 字符串相乘(Java)

    题目 https://leetcode.com/problems/multiply-strings/ 题解 模拟手动乘法,列竖式 class Solution {public String multi ...

  5. LeetCode #43字符串相乘

    1.背景知识 1.1 String,StringBuffer,StringConstructor String类是不可变类.StringBuffer和StringConstructor是可变类,字符串 ...

  6. C++ ,leetcode 43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式

    一.思路: 字符串逆序,然后遍历两个逆序后的字符串,然后对应的字符相乘,i+j等于它的位数. string multiply(string num1, string num2) {reverseStr ...

  7. leetcode 43. 字符串相乘(Multiply Strings)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1 ...

  8. 多写写 leetcode 43. 字符串相乘

    难度:中等 频次:55 题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 注意:不能使用任何内置的 BigInt ...

  9. leetcode 43.字符串相乘

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

最新文章

  1. 校园安全责任重大 安防守护迭代升级
  2. 不良言论屏蔽方案探讨——自说自话方案
  3. WatchOS系统开发大全(7)-WKInterfaceImage
  4. JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-GUI方式-Visual VM-JProfiler-Arthas
  5. 电脑知识:电脑无法开机解决方案,赶紧收藏吧!
  6. HTML5跑酷网页游戏源码
  7. 洛谷OJ上的A+B花(zhuang)式(bi)解法
  8. Java render用法_SpringMVC ModelAndView的用法使用详解
  9. 简单高精度模板(bzoj 1089: [SCOI2003]严格n元树)
  10. 【洛谷P2279】[HNOI2003]消防局的设立
  11. Linux 下删除大量文件
  12. Python使用matplotlib画动态图
  13. linux u盘 修复工具,怎样Linux下修复U盘驱动器
  14. 项目管理的49个过程整理
  15. 直线回归和相关------(四)直线相关系数和决定系数(原理与公式推导)
  16. bzoj3039 玉蟾宫【单调栈】
  17. dc是什么游戏的简称_足球里位置简称CB和DC有什么区别
  18. SQL数据计数(count)
  19. java new jsonparser_JsonParser is deprecated
  20. 如何将DWG批量转成高清晰JPG图片

热门文章

  1. 学习《可复制的领导力》有感
  2. Linux连接蓝牙键盘
  3. 给定一个成绩a,使用switch结构求出a的等级。A:90-100,B:80-89,C:70-79,D:60-69,E:0~59
  4. MyBatis中设置事务自动提交
  5. 当兵的目标和计划_最新大学生征兵工作计划
  6. java argument type mismatch_解决mybatisplus插入报错argument type mismatch的问题
  7. 第7章 面向对象技术
  8. 银河麒麟V10(Kylin Linux V10)之DBeaver安装
  9. 你不是迷茫,你只是浮躁
  10. NVIDIA显卡硬件技术交流整理