leetcode-43. 字符串相乘

2022-06-17 11:14:20 浏览数 (1)

JAVA解法

代码语言:javascript复制
class Solution {
    public String multiply(String num1, String num2) {
        // 若两个字符串任一为 0,则相乘结果就是 0
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        // 定义一个储存结果集的变量,按照题目要求是字符串
        String ans = "0";
        // 分别求出两个字符串的长度
        int m = num1.length(), n = num2.length();
        // 对 num2 从右边开始遍历,因为右边是低位
        for (int i = n - 1; i >= 0; i--) {
            // 定义一个可拼接的 StringBuffer 类型的变量
            StringBuffer curr = new StringBuffer();
            // 定义一个储存进位值的变量
            int add = 0;
            // i 向右移动是向高位移动,移动几位就要补几个零
            for (int j = n - 1; j > i; j--) {
                curr.append(0);
            }
            // 读取每一个字符与 '0' 作差得到整形的结果,这是因为 ASCII 码值的字符 '0'~'9' 是紧挨着的
            int y = num2.charAt(i) - '0';
            // 同样的,对 num1 从低位进行遍历
            for (int j = m - 1; j >= 0; j--) {
                // 获取字符对应的整形值
                int x = num1.charAt(j) - '0';
                // 两整形相乘加上上一个进位
                int product = x * y   add;
                // 将结果对 10 求余,得出个位的值,十位的当进位处理
                curr.append(product % 10);
                // 将结果除以 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) {
        // 获取传进来的两个字符串的长度,且定义一个保存进位的 add 变量
        int i = num1.length() - 1, j = num2.length() - 1, add = 0;
        // 定义结果集
        StringBuffer ans = new StringBuffer();
        // 只要以上三个变量不为任一一个不为 0 都能进入循环
        while (i >= 0 || j >= 0 || add != 0) {
            // num1 长度不为 0 则继续取值
            int x = i >= 0 ? num1.charAt(i) - '0' : 0;
            // num2 长度不为 0 则继续取值
            int y = j >= 0 ? num2.charAt(j) - '0' : 0;
            // 两字符串相加再加上上一步的进位
            int result = x   y   add;
            // 对结果求余作为本次运算的结果
            ans.append(result % 10);
            // 对结果除以 10 获得进位的值
            add = result / 10;
            // 维护两个指针
            i--;
            j--;
        }
        // 最后要记得将答案反转一下
        ans.reverse();
        // 返回最终答案,记得 toString 变成 String 类型
        return ans.toString();
    }
}

题解分析

  这道题的思路是让一个字符串每个字符与另一个字符串的每一个字符相乘,该进位就进位,该补 0 就补 0,每一次相乘后将结果相加,加到最终就是相乘的结果。   若两个字符串任一为 0,则相乘结果就是 0,直接返回 0 即可。定义一个储存结果集的变量,按照题目要求是字符串,分别求出两个字符串的长度,对 num2 从右边开始遍历,因为右边是低位,定义一个可拼接的 StringBuffer 类型的变量,定义一个储存进位值的变量,i 向左移动是向高位移动,移动几位就要补几个零,读取每一个字符与 ‘0’ 作差得到整形的结果,这是因为 ASCII 码值的字符 ‘0’~‘9’ 是紧挨着的。 同样的,对 num1 从低位进行遍历,先获取字符对应的整形值,两整形相乘加上上一个进位,将结果对 10 求余,得出个位的值,十位的当进位处理,并将结果除以 10 取整,相当于只获取了十位的值,最后的进位是当新的一位处理,直接拼接即可,以上各种拼接后,数值大的在右边,而现实的数,数值大的在右边,所以需要进行一次反转,调用字符串相加的算法得出结果后加入结果集,最后返回最终结果集即可。   字符串相加的算法:思路是将其每个字符转换成整型相加得出结果再转换成字符串。首先获取传进来的两个字符串的长度,且定义一个保存进位的 add 变量,定义结果集,只要以上三个变量不为任一一个不为 0 都能进入循环,只要 num1 或者 num2 的长度不为 0 则进行取值。这里的 num1.charAt(i) - '0' 主要是利用字符 ‘0’ 到 ‘9’ 的 ASCII 码值是连续的,让其作差即可得到字符的本身的整型值。   取完值,两字符串相加再加上上一步的进位,对结果求余作为本次运算的结果,再对结果除以 10 获得进位的值,同步维护两个指针,最后要记得将答案反转一下,因为拼接字符串是从左到右拼接的,但是我们的数是从又到左数值越大的,返回最终答案,记得 toString 变成 String 类型。

leetcode原题:43. 字符串相乘

0 人点赞