美文网首页
LeetCode043——字符串相乘

LeetCode043——字符串相乘

作者: smart_my | 来源:发表于2019-06-24 22:40 被阅读0次

    原题链接:https://leetcode-cn.com/problems/multiply-strings/description/

    题目描述:

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

    示例 1:

    输入: num1 = "2", num2 = "3"
    
    输出: "6"
    

    示例 2:

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

    思路:

    本题的思路很简单,就是单纯地模拟手工算法得出结果,但想把这个程序写得优美还是有难度的,下面将罗列我自己写程序时的一个个不同的实现版本。

    逻辑如下:

    (1)数组stringBuilders里存储的是字符串num2中的各位上的数和num1相乘的结果,比如对于123 * 456而言,其存储的就是738,615,492。

    (2)给数组stringBuilders中的元素添0,使其成为738,6150,49200。

    (3)反转stringBuilders中的元素,使其成为837,0516,00294。

    (4)对stringBuilders中的元素进行相加操作,使其成为88065。

    (5)反转(4)中的结果,得到最终答案56088。

    注意,在程序开始时,需要对乘数为0的情况做特殊处理,否则会出现类似0000的答案。

    时间复杂度是O(n1 * n2),其中n1为字符串num1的长度,n2为字符串num2的长度。实现过程中使用了一个长度为n2的StringBuilder类型的数组,而数组中每个元素的长度是n1或者n1 + 1,因此空间复杂度为O(n1 * n2)。

    public class Solution {
        public String multiply(String num1, String num2) {
            int n1 = num1.length();
            int n2 = num2.length();
    
            if ((n1 == 1) && (Integer.parseInt(num1) == 0)) {
                return num1;
            }
    
            if ((n2 == 1) && (Integer.parseInt(num2) == 0)) {
                return num2;
            }
    
            StringBuilder result = new StringBuilder();
            StringBuilder[] stringBuilders = new StringBuilder[n2];
    
            for (int i = n2 - 1; i >= 0; i--) {
                StringBuilder stringBuilder = new StringBuilder();
                int flag = 0;
    
                for (int j = n1 - 1; j >= 0; j--) {
                    Integer integer = Integer.parseInt(num1.substring(j, j + 1)) * Integer.parseInt(num2.substring(
                                i, i + 1));
                    stringBuilder.append((integer + flag) % 10);
                    flag = (integer + flag) / 10;
                }
    
                if (flag > 0) {
                    stringBuilder.append(flag);
                }
    
                stringBuilders[n2 - i - 1] = stringBuilder.reverse();
            }
    
            for (int i = 0; i < n2; i++) {
                for (int j = 0; j < i; j++) {
                    stringBuilders[i].append(0);
                }
            }
    
            for (int i = 0; i < n2; i++) {
                stringBuilders[i] = stringBuilders[i].reverse();
            }
    
            int flag = 0;
            int maxLen = 0;
    
            for (int i = 0; i < n2; i++) {
                maxLen = Math.max(maxLen, stringBuilders[i].length());
            }
    
            for (int i = 0; i < maxLen; i++) {
                int sum = 0;
    
                for (int j = 0; j < n2; j++) {
                    if (i < stringBuilders[j].length()) {
                        sum += Integer.parseInt(stringBuilders[j].substring(i, i +
                                1));
                    }
                }
    
                int num = (sum + flag) % 10;
                flag = (sum + flag) / 10;
                result.append(num);
            }
    
            if (flag > 0) {
                result.append(flag);
            }
    
            return result.reverse().toString();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:LeetCode043——字符串相乘

          本文链接:https://www.haomeiwen.com/subject/rqgaqctx.html