力扣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 }

posted on 2022-06-15 11:33  我不想一直当菜鸟  阅读(725)  评论(0编辑  收藏  举报