字符串相乘
给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=43
解题思路分析:
乘法的原理大家都懂,本题只是还原一下我们口算的过程而已。比如123乘以456,实际上我们可以看做 6*123+5*1230+4*12300。
实现代码:
public String multiply(String num1, String num2) { if("0".equals(num1)||"0".equals(num2)) return "0"; List<String> list=new ArrayList<>(); for(int i=num1.length()-1;i>=0;i--){ int n1=num1.charAt(i)-'0'; if(n1==0) { num2+="0"; continue; } int carry=0; StringBuilder sb=new StringBuilder(); for(int j=num2.length()-1;j>=0;j--){ int n2=num2.charAt(j)-'0'; int mul=n1*n2; int num=(mul+carry)%10; sb.append(num); carry=(mul+carry)/10; } if(carry!=0) sb.append(carry); list.add(sb.reverse().toString()); num2+="0"; } return sum(list); } String sum(List<String> list){ String num1=list.get(0); for(int i=1;i<list.size();i++){ StringBuilder sb=new StringBuilder(); String num2=list.get(i); int i1=num1.length()-1; int i2=num2.length()-1; int carry=0; while(i1>=0||i2>=0){ int n1=i1>=0?num1.charAt(i1)-'0':0; int n2=i2>=0?num2.charAt(i2)-'0':0; int num=(n1+n2+carry)%10; sb.append(num); carry=(n1+n2+carry)/10; i1--; i2--; } if(carry!=0) sb.append(carry); num1=sb.reverse().toString(); } return num1; }
本题解法执行时间为18ms。
Runtime: 18 ms, faster than 16.23% of Java online submissions for Multiply Strings.
Memory Usage: 40.5 MB, less than 10.00% of Java online submissions for Multiply Strings.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-43-multiply-strings-解题思路分析/