首页 > 其他 > 详细

43. 字符串相乘 - LeetCode

时间:2021-02-28 15:30:22      阅读:24      评论:0      收藏:0      [点我收藏+]

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

43. 字符串相乘 - LeetCode

原文:https://www.cnblogs.com/xiafrog/p/14458871.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!