[LeetCode] #43 字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

输入: num1 = "123", num2 = "456"

输出: "56088"

模拟乘法的过程

class Solution {
    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")) return "0";
        String res = "0";
        List<StringBuilder> list = new ArrayList();
        char[] char1 = num1.toCharArray();
        char[] char2 = num2.toCharArray();
        int l1 = num1.length(), l2 = num2.length();
        int temp = 0, carry = 0, cur = 0, count = -1;
        for(int i = l1-1; i >= 0; i--){
            StringBuilder sb = new StringBuilder();
            carry = 0;
            for(int j = l2-1; j >= 0; j--){
                temp =  (char1[i] - '0') * (char2[j] - '0') + carry;
                sb.append(temp % 10);
                carry = temp / 10;
            }
            count++;
            if(carry != 0) sb.append(carry);
            sb.reverse();
            for(int k = count; k > 0; k--){
                sb.append(0);
            }
            System.out.println(sb.toString());
            res = addStrings(res, sb.toString());
        }
        return res;
    }

    public String addStrings(String num1, String num2) {
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        StringBuffer ans = new StringBuffer();
        while (i >= 0 || j >= 0 || add != 0) {
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            int result = x + y + add;
            ans.append(result % 10);
            add = result / 10;
            i--;
            j--;
        }
        ans.reverse();
        return ans.toString();
    }
}

优化,使用数组代替字符串存储

class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        int m = num1.length(), n = num2.length();
        int[] ansArr = new int[m + n];
        for (int i = m - 1; i >= 0; i--) {
            int x = num1.charAt(i) - '0';
            for (int j = n - 1; j >= 0; j--) {
                int y = num2.charAt(j) - '0';
                ansArr[i + j + 1] += x * y;
            }
        }
        for (int i = m + n - 1; i > 0; i--) {
            ansArr[i - 1] += ansArr[i] / 10;
            ansArr[i] %= 10;
        }
        int index = ansArr[0] == 0 ? 1 : 0;
        StringBuffer ans = new StringBuffer();
        while (index < m + n) {
            ans.append(ansArr[index]);
            index++;
        }
        return ans.toString();
    }
}

知识点:

总结:

posted @ 2021-10-15 20:01  1243741754  阅读(65)  评论(0)    收藏  举报