力扣43(java)-字符串相乘(中等)
题目:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = "2", num2 = "3"
输出: "6"
示例 2:
输入: num1 = "123", num2 = "456"
输出: "56088"
提示:
- 1 <= num1.length, num2.length <= 200
- num1 和 num2 只能由数字组成。
- num1 和 num2 都不包含任何前导零,除了数字0本身。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
1.特殊情况,如果其中任何一个数为0,则直接返回0;
2.两个数相乘的最大位数在[m+n-1]到[m+n]之间,100x 10 =1000(4位),999x99=98901(5位);
3.使用一个长度为[m+n]的res数组来存放得到的结果数,使用两个循环,从后往前遍历,先让num1中的最后一位与num2中的每一位相乘,得到结果的第一位放在res[i+j+1],进位放在res[i+j],再让num1中倒数第二位与num2中的每一位相乘,得到的数放在对应的位置,对应位置的数再进行相加,依此类推;
3.需要去掉数组起始位置的0,再转换成字符串进行返回。
代码:
1 class Solution { 2 public String multiply(String num1, String num2) { 3 int n = num1.length(); 4 int m = num2.length(); 5 int[] res = new int[m + n]; 6 //先判断特殊情况,存在0的情况 7 if(num1.equals("0") || num2.equals("0")){ 8 return "0"; 9 } 10 //进行相乘,对应位置的数进行相加 11 for(int i = n-1; i >= 0; i--){ 12 int n1 = num1.charAt(i) - '0'; 13 for(int j = m-1; j >= 0; j--){ 14 int n2 = num2.charAt(j) - '0'; 15 int sum = res[i+j+1] + n1 * n2; 16 res[i+j+1] = sum % 10; 17 res[i+j] = res[i+j] + sum / 10; 18 } 19 } 20 StringBuilder sb = new StringBuilder(); 21 for(int i = 0; i < res.length; i++){ 22 //去掉数组开头的0 23 if(i == 0 && res[i] == 0) continue; 24 sb.append(res[i]); 25 } 26 return sb.toString(); 27 } 28 }