43.字符串相乘

2019-01-03  本文已影响0人  夜空中最亮的星_6c64

题目描述:

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

示例:

示例 1:
输入: num1 = "2", num2 = "3";输出: "6"
示例 2:
输入: num1 = "123", num2 = "456";输出: "56088"

说明:

num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。

注意:

不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。

解答:

public static String multiply(String num1, String num2) {
        int n1 = num1.length() - 1;
        int n2 = num2.length() - 1;
        if (n1 < 0 || n2 < 0) {
            return "";
        }
        // 乘积的结果位数最多为:两个乘数的位数之和
        int mul[] = new int[n1 + n2 + 2];
        // 循环两个乘数的位数
        for (int i = n1; i >= 0; i--) {
            for (int j = n2; j >= 0; j--) {
                // 两个乘数的每一位进行相乘
                int midmul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                // 相乘结果+进位
                midmul += mul[i + j + 1];
                // 第i位和第j位相乘的结果在乘积中的位置为[i+j,i+j+1]
                // [i+j]需要累加;相当于结果高位【数组中为低位】
                mul[i + j] += midmul / 10;
                // [i+j+1]直接加余数即可
                mul[i + j + 1] = midmul % 10;
            }
        }
        StringBuilder sBuilder = new StringBuilder();
        int i = 0;
        while (i < mul.length - 1 && mul[i] == 0)
            // 截取前面的0
            i++;
        for (; i < mul.length; i++) {
            // 拼接字符串作为结果
            sBuilder.append(mul[i]);
        }
        return sBuilder.toString();
    }

技巧:

字符串相乘:可以当作大数相乘,处理每位相乘即可,最后拼接结果。

上一篇 下一篇

猜你喜欢

热点阅读