題目描述:
給定兩個以字符串形式表示的非負整數 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)或直接將輸入轉換爲整數來處理。
解題思路:
本題的總體思路是新建一個長度爲len1+len2+2的數組(兩個數相乘的積的長度不會超過這兩個數的長度之和),將兩個數相乘的積存儲在數組中,然後新建一個可變字符串的StringBuilder數組,將數組轉成字符串形式。
在兩數相乘的過程中先對字符串遍歷然後相乘得到sum,arr[i+j+1]等於數組i+j+1位置的最終結果。
class Solution {
public String multiply(String num1, String num2) {
int len1 = num1.length()-1;
int len2 = num2.length()-1;
//兩個數相乘的積的長度不會超過這兩個數的長度之和,因此創建一個長度爲len1+len2+1的int數組
int[] arr = new int[len1+len2+2];
for(int i=len1;i>=0;i--){
for(int j=len2;j>=0;j--){
int sum=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
sum += arr[i+j+1];//對進位的部分進行處理
arr[i+j]+=sum/10;//sum/10爲進位的部分,arr[i+j]爲進位後數組在該位置得到的結果
arr[i+j+1]=sum%10;
}
}
StringBuilder sb = new StringBuilder();
int i=0;
//積的左邊沒有數是,在int數組默認爲0,例如06
//因此將i+1,在對數組進行遍歷就能得到最後的結果。例如“06”最後變成爲“6”
//arr.length-1用來解決"0"乘以"0"等於“0”的情況,如果字符串長度爲1,則不執行while語句直接執行for語句。
while(i<arr.length-1 && arr[i]==0){
i++;
}
for(;i<arr.length;i++){
sb.append(arr[i]);
}
return sb.toString();
}
}