LeetCode 43. 字符串相乘【c++/java详细题解】
目录
- 1、题目
- 2、思路
- 3、c++代码
- 4、java代码
1、题目
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
说明:
num1
和num2
的长度小于110
。num1
和num2
只包含数字0-9
。num1
和num2
均不以零开头,除非是数字0
本身。- 不能使用任何标准库的大数类型(比如 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
位,为了方便计算,将num1
和num2
反向存储到A[]
和B[]
中,即位数低的在数组前面,且开一个大小是n + m
的C[]
存储计算后的答案。 - 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详细题解】相关推荐
- leetcode -43 -字符串相乘 -java版
文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...
- LeetCode 43字符串相乘44通配符匹配
原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...
- LeetCode 43. 字符串相乘(大数乘法)
文章目录 1. 题目 2. 小学竖式乘法 2.1 普通版 2.2 优化版 1. 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示 ...
- leetcode 43. Multiply Strings | 43. 字符串相乘(Java)
题目 https://leetcode.com/problems/multiply-strings/ 题解 模拟手动乘法,列竖式 class Solution {public String multi ...
- LeetCode #43字符串相乘
1.背景知识 1.1 String,StringBuffer,StringConstructor String类是不可变类.StringBuffer和StringConstructor是可变类,字符串 ...
- C++ ,leetcode 43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式
一.思路: 字符串逆序,然后遍历两个逆序后的字符串,然后对应的字符相乘,i+j等于它的位数. string multiply(string num1, string num2) {reverseStr ...
- leetcode 43. 字符串相乘(Multiply Strings)
目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1 ...
- 多写写 leetcode 43. 字符串相乘
难度:中等 频次:55 题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 注意:不能使用任何内置的 BigInt ...
- leetcode 43.字符串相乘
题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
最新文章
- 校园安全责任重大 安防守护迭代升级
- 不良言论屏蔽方案探讨——自说自话方案
- WatchOS系统开发大全(7)-WKInterfaceImage
- JVM学习笔记之-JVM性能监控-JVM监控及诊断工具-GUI方式-Visual VM-JProfiler-Arthas
- 电脑知识:电脑无法开机解决方案,赶紧收藏吧!
- HTML5跑酷网页游戏源码
- 洛谷OJ上的A+B花(zhuang)式(bi)解法
- Java render用法_SpringMVC ModelAndView的用法使用详解
- 简单高精度模板(bzoj 1089: [SCOI2003]严格n元树)
- 【洛谷P2279】[HNOI2003]消防局的设立
- Linux 下删除大量文件
- Python使用matplotlib画动态图
- linux u盘 修复工具,怎样Linux下修复U盘驱动器
- 项目管理的49个过程整理
- 直线回归和相关------(四)直线相关系数和决定系数(原理与公式推导)
- bzoj3039 玉蟾宫【单调栈】
- dc是什么游戏的简称_足球里位置简称CB和DC有什么区别
- SQL数据计数(count)
- java new jsonparser_JsonParser is deprecated
- 如何将DWG批量转成高清晰JPG图片