43. 字符串相乘
難度中等264
給定兩個以字符串形式表示的非負整數?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)或直接將輸入轉換為整數來處理。
class Solution {/*** 計算形式* num1* x num2* ------* result*/// 計算結果String res = "0";public String multiply(String num1, String num2) {if (num1.equals("0") || num2.equals("0")) {return "0";}// num2 逐位與 num1 相乘for (int i = num2.length() - 1; i >= 0; i--) {int carry = 0;// 保存 num2 第i位數字與 num1 相乘的結果StringBuilder temp = new StringBuilder();// 補 0 for (int j = 0; j < num2.length() - 1 - i; j++) {temp.append(0);}int n2 = num2.charAt(i) - '0';// num2 的第 i 位數字 n2 與 num1 相乘for (int j = num1.length() - 1; j >= 0 || carry != 0; j--) {int n1 = j < 0 ? 0 : num1.charAt(j) - '0';int product = (n1 * n2 + carry) % 10;temp.append(product);carry = (n1 * n2 + carry) / 10;}// 將當前結果與新計算的結果求和作為新的結果res = addStrings(res, temp.reverse().toString());}return res;}/*** 對兩個字符串數字進行相加,返回字符串形式的和*/public String addStrings(String num1, String num2) {StringBuilder builder = new StringBuilder();int carry = 0;for (int i = num1.length() - 1, j = num2.length() - 1;i >= 0 || j >= 0 || carry != 0;i--, j--) {int x = i < 0 ? 0 : num1.charAt(i) - '0';int y = j < 0 ? 0 : num2.charAt(j) - '0';int sum = (x + y + carry) % 10;builder.append(sum);carry = (x + y + carry) / 10;}return builder.reverse().toString();}
}
?