LeetCode-43. 字符串相乘

题目来源

43. 字符串相乘

题目详情

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

示例 1:

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

示例 2:

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

说明:

  1. num1 和 num2 的长度小于110。
  2. num1 和 num2 只包含数字 0-9
  3. num1 和 num2 均不以零开头,除非是数字 0 本身。
  4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

题解分析

解法一:模拟法

  1. 竖式运算思想,以 num1 为 123,num2 为 456 为例分析:
    image

  2. 遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加。

  3. 注意:

    • num2 除了第一位的其他位与 num1 运算的结果需要 补0
    • 此外,对于num1或者num2为0的情况也要特殊考虑,否则返回的结果将包含多个多余的0符号
    • 计算字符串数字累加其实就是 415. 字符串相加

代码实现

class Solution {
    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")){
            return "0";
        }
        int n2 = num2.length();
        int n1 = num1.length();

        String res = "";
        // 遍历num2,逐位与num1相乘
        for(int i=n2-1; i>=0; i--){
            StringBuilder sb = new StringBuilder();//存储乘法临时结果
            for(int j=0; j<n2-1-i; j++){
                sb.append(0);
            }
            int nu2 = num2.charAt(i) - '0';

            int carry = 0;//存储进位
            for(int j=n1-1; j>=0 || carry != 0; j--){
                int nu1 = j <0 ? 0 : num1.charAt(j) - '0'; 
                int temp = (nu1 * nu2 + carry) % 10;
                sb.append(temp);
                carry = (nu1 * nu2 + carry) / 10;
            }

            res = add(res, sb.reverse().toString());

        }
        return res;
    }

    // 字符串加法
    private String add(String num1, String num2){
        int n2 = num2.length();
        int n1 = num1.length();

        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for(int i=n1-1, j=n2-1; i >=0 || j>=0 || carry != 0; i--, j--){
            int nu1 = i <0 ? 0 : num1.charAt(i) - '0';
            int nu2 = j <0 ? 0 : num2.charAt(j) - '0';
            int temp = (nu1 + nu2 + carry) % 10;
            sb.append(temp);
            carry = (nu1 + nu2 + carry) / 10;
        }
        return sb.reverse().toString();
    }
}

参考

  1. 优化版竖式(打败99.4%)

结果展示

image

posted @ 2022-01-23 17:13  Garrett_Wale  阅读(25)  评论(0编辑  收藏  举报