43. 字符串相乘 - LeetCode

43. 字符串相乘

题目链接

模拟竖式

  • 用num2的每一个和num1相乘,最终结果相加
  • 注意后面要补0
class Solution {
    public String multiply(String num1, String num2) {
        int len2 = num2.length();
        List<StringBuilder> products = new ArrayList<>();
        for(int i = len2 - 1; i >= 0; i--){
            StringBuilder product = mul(num1, num2.charAt(i));
            for(int j = i; j < len2 - 1; j++)
                product.append('0');
            products.add(product);
        }
        StringBuilder ans = new StringBuilder("0");
        for(StringBuilder num : products)
            ans = add(ans, num);
        while(ans.length() > 1 && ans.charAt(0) == '0')
            ans.deleteCharAt(0);
        return ans.toString();
    }
    StringBuilder mul(String num1, char num2){
        int len1 = num1.length(); 
        int carry = 0, b = num2 - '0';
        StringBuilder ans = new StringBuilder();
        for(int i = len1 - 1; i >= 0; i--){
            int a = num1.charAt(i) - '0';
            int c = a * b + carry;
            carry = c / 10;
            ans.append(c % 10);
        }
        if(carry != 0) ans.append(carry);
        return ans.reverse();
    }
    StringBuilder add(StringBuilder num1, StringBuilder num2){
        int len1 = num1.length();
        int len2 = num2.length();
        int i = len1 - 1, j = len2 - 1;
        int carry = 0;
        StringBuilder ans = new StringBuilder();
        while(i >= 0 && j >= 0){
            int a = num1.charAt(i) - '0';
            int b = num2.charAt(j) - '0';
            int c = a + b + carry;
            carry = c / 10;
            ans.append(c % 10);
            i--;
            j--;
        }
        while(i >= 0){
            int a = num1.charAt(i) - '0';
            int c = a + carry;
            carry = c / 10;
            ans.append(c % 10);
            i--;
        }
        while(j >= 0){
            int b = num2.charAt(j) - '0';
            int c = b + carry;
            carry = c / 10;
            ans.append(c % 10);
            j--;
        }
        if(carry != 0) ans.append(carry);
        return ans.reverse();
    }
}
  • 这个方法用了非常多的字符串拼接操作,速度非常慢

优化竖式

  • num1和num2的每一位分别相乘,直接加在对应的位置,用int数组来存储,速度较快
  • num1的第i为和num2的第j位相乘,结果存在ans的第i+j+1位,如果大于10,则进位到i+j位
  • 注意去除前缀0
class Solution {
    public String multiply(String num1, String num2){
        int len1 = num1.length();
        int len2 = num2.length();
        int[] ans = new int[len1 + len2];
        for(int i = len1 - 1; i >= 0; i--){
            int a = num1.charAt(i) - '0';
            for(int j = len2 - 1; j >= 0; j--){
                int b = num2.charAt(j) - '0';
                int c = a * b + ans[i + j + 1];
                ans[i + j] += c / 10;
                ans[i + j + 1] = c % 10;
            }
        }
        StringBuilder ansString = new StringBuilder();
        int i;
        for(i = 0; i < len1 + len2 - 1 && ans[i] == 0; i++);
        for(; i < len1 + len2; i++)
            ansString.append(ans[i]);
        return ansString.toString();
    }
}
posted @ 2021-02-28 14:03  一天到晚睡觉的鱼  阅读(67)  评论(0)    收藏  举报