【LeetCode】Multiply Strings 解題報告
阿新 • • 發佈:2019-01-06
【題目】
Given two numbers represented as strings, return multiplication of the numbers as a string.
Note: The numbers can be arbitrarily large and are non-negative.
【解析】題意:兩個字串表示的非負整數相乘,用字串的形式返回積。
思路:逐位相乘。
關鍵:中間結果如何儲存?如果用字串儲存中間結果,頻繁該值不太方便,所以還是用整數陣列儲存,最後再轉為字串比較方便。
public class Solution { public String multiply(String num1, String num2) { if (num1.equals("0") || num2.equals("0")) return "0"; int[] table = new int[num1.length() + num2.length()];//存放乘積,低位存低位 int len = 0; //積的長度,用於轉為字串 for (int i = num1.length() - 1; i >= 0; i--) { int digit1 = (int)(num1.charAt(i) - '0'); int carry = 0; int k = num1.length() - 1 - i; //本輪乘積結果開始的位置 for (int j = num2.length() - 1; j >= 0; j--, k++) { int digit2 = (int)(num2.charAt(j) - '0'); int res = digit1 * digit2; //位與位的乘積 res += table[k]; //加上上一輪乘積第k位的數 res += carry; //加上進位到第k位的數 table[k] = res % 10; //進位後剩餘的數 carry = res / 10; //進位 } //更新結果的長度 if (k - 1 > len) { len = k - 1; } //如果最後進位不為0 if (carry > 0) { table[k] += carry; if (table[k] > 9) { table[k + 1] = table[k] / 10; table[k] %= 10; k++; } if (k > len) { //更新結果的長度 len = k; } } } //把積轉為字串 String ans = ""; for (int i = len; i >= 0; i--) { ans += String.valueOf(table[i]); } return ans; } }