43. 字符串相乘

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

解题思路:举个例子,比如 89 x 76,那么根据小学的算术知识,不难写出计算过程如下:

8 9  <- num2
    7 6  <- num1
-------
    5 4
  4 8
  6 3
5 6
-------
6 7 6 4

不难发现,两数相乘得到的乘积的长度其实其实不会超过两个数字的长度之和,若 num1 长度为m,num2 长度为n,则 num1 x num2 的长度不会超过 m+n,还有就是要明白乘的时候为什么要错位,比如6乘8得到的 48 为啥要跟6乘9得到的 54 错位相加,因为8是十位上的数字,其本身相当于80,所以错开的一位实际上末尾需要补的0。还有一点需要观察出来的就是,num1 和 num2 中任意位置的两个数字相乘,得到的两位数在最终结果中的位置是确定的,比如 num1 中位置为i的数字乘以 num2 中位置为j的数字,那么得到的两位数字的位置为 i+j 和 i+j+1,明白了这些后,就可以进行错位相加了,累加出最终的结果。

由于要从个位上开始相乘,所以从 num1 和 num2 字符串的尾部开始往前遍历,分别提取出对应位置上的字符,将其转为整型后相乘。然后确定相乘后的两位数所在的位置 p1 和 p2,由于 p2 相较于 p1 是低位,所以将得到的两位数 mul 先加到 p2 位置上去,这样可能会导致 p2 位上的数字大于9,所以将十位上的数字要加到高位 p1 上去,只将余数留在 p2 位置,这样每个位上的数字都变成一位。然后要做的是从高位开始,将数字存入结果 res 中,记住前面的零要跳过,最后处理下corner case,即若结果 res 为空,则返回 "0",否则返回结果 res。

代码 t98 s88 java

class Solution {
    public String multiply(String num1, String num2) {
        int len1 = num1.length(), len2 = num2.length();
        int[] vec = new int[len1+len2];
        for(int i=len1-1; i>=0; i--){
            for(int j=len2-1; j>=0; j--){
                int p1 = i+j, p2 = i+j+1;
                int m = num1.charAt(i) - '0';
                int n = num2.charAt(j) - '0';
                int t = m * n + vec[p2];
                vec[p2] = t % 10;
                vec[p1] += t / 10;                
            }
        }
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<len1+len2; i++){
            if(!(sb.length()==0 && vec[i]==0)) sb.append((char)(vec[i] + '0'));
        }
        return sb.length()==0 ? "0" : sb.toString();
    }
}

代码t98 s54 cpp

class Solution {
public:
    string multiply(string num1, string num2) {
        int m = num1.size(), n = num2.size();
        vector<int> vals(m+n);
        for(int i=m-1; i>=0; i--){
            for(int j=n-1; j>=0; j--){
                int t = (num1[i] - '0') * (num2[j] - '0');
                int p1 = i + j, p2 = i + j + 1, sum = t + vals[p2];
                vals[p1] += sum / 10;
                vals[p2] = sum % 10;
            }
        }
        string res = "";
        for(int val : vals){
            if(!res.empty() || val!=0) res.push_back(val+'0');
        }
        return res.empty() ? "0" : res;        
    }
};

参考资料
https://www.cnblogs.com/grandyang/p/4395356.html

上一篇:se实现数组去重


下一篇:【Pytorch Lightning】基本特征