首页 > 代码库 > 【LeetCode】Multiply Strings 解题报告

【LeetCode】Multiply Strings 解题报告

【题目】

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;
    }
}


【LeetCode】Multiply Strings 解题报告