leetcode 43 : 字符串相乘
给定两个以字符串形式表示的非负整数 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本身。
Related Topics
数学
字符串
模拟
思路1:
-
根据数字的位置计算结果进行累加。
-
例: 32 * 42 (3在第1位,4在第一位,那么3*4的结果就在第一位,计算完每一位的结果后,再考虑进位,求出完整地结果)
-
由于涉及到大量的字符串运算,可以先字符串转换成数组。
public String multiply(String num1, String num2) { //判断乘数为0的情况 因为会出现结果为0000这种情况 if(num1.equals("0") || num2.equals("0")){ return "0"; } //把字符串转换成每一位都是int型 char[] chars1 = num1.toCharArray(); char[] chars2 = num2.toCharArray(); int[] result = new int[chars1.length+chars2.length]; int[] n1 = new int[chars1.length]; int[] n2 = new int[chars2.length]; for(int i = 0; i<chars1.length;i++){ n1[i] = chars1[i] - '0'; } for(int i = 0; i < chars2.length;i++){ n2[i] = chars2[i] - '0'; } //相乘 根据下标位数判断乘完后的结果 for(int i = 0 ; i < chars1.length;i++){ for (int j = 0 ; j < chars2.length;j++){ result[i+j] += n1[i]*n2[j]; } } //进位 for(int i = result.length - 1;i > 0;i--){ result[i-1] += result[i]/10; result[i] = result[i] % 10; } // StringBuilder sb = new StringBuilder(); //因为实际的结果位数 是 chars1.length-1 加上 chars2.length-1 for(int i = 0 ; i <= chars1.length+chars2.length-2;i++){ sb.append(result[i]); } return sb.toString(); } 解答成功: 执行耗时:1 ms,击败了100.00% 的Java用户 内存消耗:41.5 MB,击败了5.01% 的Java用户