Leetcode43: 字符串相乘--hammring

題目描述:

給定兩個以字符串形式表示的非負整數 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();
        
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章