前端算法第一二六弹-字符串相乘

「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战

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

注意: 不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"
复制代码

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"
复制代码

做加法

如果 num1​ 和 num2 之一是 0,则直接将 000 作为结果返回即可。

如果 num1​ 和 num2 都不是 0,则可以通过模拟「竖式乘法」的方法计算乘积。从右往左遍历乘数,将乘数的每一位与被乘数相乘得到对应的结果,再将每次得到的结果累加。这道题中,被乘数是 num1​,乘数是 num2​。

需要注意的是,num2\textit{num}_2num2​ 除了最低位以外,其余的每一位的运算结果都需要补 000。

class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        String ans = "0";
        int m = num1.length(), n = num2.length();
        for (int i = n - 1; i >= 0; i--) {
            StringBuffer curr = new StringBuffer();
            int add = 0;
            for (int j = n - 1; j > i; j--) {
                curr.append(0);
            }
            int y = num2.charAt(i) - '0';
            for (int j = m - 1; j >= 0; j--) {
                int x = num1.charAt(j) - '0';
                int product = x * y + add;
                curr.append(product % 10);
                add = product / 10;
            }
            if (add != 0) {
                curr.append(add % 10);
            }
            ans = addStrings(ans, curr.reverse().toString());
        }
        return ans;
    }

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

复制代码

复杂度分析

  • 时间复杂度:O(mn+n2),其中 m 和 n 分别是 num1​ 和 num2​ 的长度。需要从右往左遍历 num2​,对于 num2​ 的每一位,都需要和 num1​ 的每一位计算乘积,因此计算乘积的总次数是 mn。字符串相加操作共有 nnn 次,相加的字符串长度最长为 m+n,因此字符串相加的时间复杂度是 O(mn+n2)。总时间复杂度是 O(mn+n2)。
  • 空间复杂度:O(m+n),其中 m 和 n 分别是 num1​ 和 num2​ 的长度。空间复杂度取决于存储中间状态的字符串,由于乘积的最大长度为 m+n,因此存储中间状态的字符串的长度不会超过 m+n。

猜你喜欢

转载自juejin.im/post/7066426974591254535