每日题解:LeetCode 43. 字符串相乘

Author Avatar
清水雅然君 08月 13,2020

题目地址
个人博客地址

题目描述

给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

解法

class Solution {
    public String multiply(String num1, String num2) {
 int m = num1.length(), n = num2.length();
        int[] res=new int[m + n];
        for (int i = m-1; i >=0; i--) {
            for (int j = n-1; j >=0; j--) {
                int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
                int p1 = i + j, p2 = i + j + 1;
                int sum = mul + res[p2];
                res[p2] = sum % 10;
                res[p1] += sum / 10;
            }
        }
        int i = 0;
        String ans="";
        while (i < res.length) {
            if(res[i] == 0 && ans.length()==0){
                i++;
               continue;
            }
            ans+=res[i++];
        }
        return ans.length() == 0 ? "0" : ans;
    }
}

解题思路

竖式乘法

按照计算乘法的习惯,我们一般如图所示计算两个数相乘
在这里插入图片描述
所以就可以模拟竖式的作法计算字符串相乘的结果
在这里插入图片描述
这里以数组记录相应位上的数字,两个数相乘,其结果个数最高为num1.length()+num2.length(),

 int m = num1.length(), n = num2.length();
int[] res=new int[m + n];
for (int i = m-1; i >=0; i--) {
 for (int j = n-1; j >=0; j--) {
 //计算出积
int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
}
}

比如num2=6,其i=2;当j=2,即mun1=3,计算结果为18res数组的长度为6,第一位在数组下标4,第二位在下标5

在这里插入图片描述
发现规律,第一位在i+j;第二位在i + j + 1,如果第一位不存在,补零处理

   for (int i = m-1; i >=0; i--) {
            for (int j = n-1; j >=0; j--) {
                int mul = (num1.charAt(i)-'0') * (num2.charAt(j)-'0');
                //在数组的下标
                int p1 = i + j, p2 = i + j + 1;
                //计算上一步的累加值
                int sum = mul + res[p2];
                res[p2] = sum % 10;
                //计算是否需要进位
                res[p1] += sum / 10;
            }
        }

计算完,遍历数组

        int i = 0;
        String ans="";
        while (i < res.length) {
        //这里处理数组开始为0的值,比如10*99;数组为0990
            if(res[i] == 0 && ans.length()==0){
                i++;
               continue;
            }
            ans+=res[i++];
        }