给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。
正确方法:结合算式相乘的思想
0 4
index 0 1 2 3 4
<---[p1 p2]
TIME:O(n*m)
SPACE:O(n+m)
1 class Solution { 2 public String multiply(String num1, String num2) { 3 if(num1 == null || num2 == null)return "0"; 4 int[] digits = new int[num1.length() + num2.length()]; 5 for(int i = num1.length() - 1;i >= 0;i--){ 6 for(int j = num2.length() - 1;j >= 0;j--){ 7 int product = (num1.charAt(i) - '0' ) * (num2.charAt(j) - '0'); 8 int p1 = i + j,p2 = i + j + 1;//乘完之后放在digit数组中的位置 9 int sum = product +digits[p2]; 10 digits[p1] += sum / 10; 11 digits[p2] = sum % 10; //数组默认进行初始化为0 12 } 13 } 14 StringBuilder res = new StringBuilder(); 15 //digits[0,0,1,0,3] 16 for(int digit : digits){ 17 if(!(digit == 0 && res.length() == 0)){ 18 res.append(digit); 19 } 20 } 21 return res.length() == 0 ? "0" : res.toString(); 22 } 23 }
错误方法:当超出最大值时失效,改成double后,并去掉科学计数法,由于精度问题会出现结果错误
1 class Solution { 2 public String multiply(String num1, String num2) { 3 long n1 = num1.charAt(num1.length()-1) - '0'; 4 long n2 = num2.charAt(num2.length()-1) - '0'; 5 num1 = new StringBuffer(num1).reverse().toString(); 6 num2 = new StringBuffer(num2).reverse().toString(); 7 System.out.println(num1); 8 for(int i = 1;i < num1.length();i++){ 9 n1 += (num1.charAt(i) - '0') *Math.pow(10, i); 10 } 11 for(int i = 1;i < num2.length();i++){ 12 n2 += (num2.charAt(i) - '0') *Math.pow(10, i); 13 } 14 return String.valueOf(n1 * n2); 15 } 16 }
17:25:54 17:26:00