1. 程式人生 > 資料庫 >Win10 Linux子系統安裝MySQL

Win10 Linux子系統安裝MySQL

技術標籤:C++面試

題目:給定兩個以字串形式表示的非負整數num1num2,返回num1num2的乘積,它們的乘積也表示為字串形式。

示例:

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

方案一:

class Solution {
private:
// 字元 乘 字串
string charMultiStr(string num, char c) {
    if (c == '1') {
        return num;
    } else if (c == '0') {
        return "0";
    }
    string sum = "";
    int len = num.size();
    int pre = 0;
    for (int i = len - 1; i >= 0; i--) {
        int t = (num[i] - '0') * (c - '0') + pre;
        pre = t / 10;
        sum.push_back(t % 10 + '0');
    }
    while (pre > 0) {
        sum.push_back(pre % 10 + '0');
        pre /= 10;
    }
    reverse(sum.begin(), sum.end());
    return sum;
}
// 字串相加
string add(string num1, string num2) {
    int i = 1;
    int pre = 0;
    string sum = "";
    while(i <= num1.size() || i <= num2.size() || pre > 0) {
        if (i <= num1.size()) {
            pre += num1[num1.size() - i] - '0';
        }
        if (i <= num2.size()) {
            pre += num2[num2.size() - i] - '0';
        }
        sum.push_back(pre % 10 + '0');
        pre = pre / 10;
        i++;
    }
    
    reverse(sum.begin(), sum.end());
    return sum;
}
public:
    string multiply(string num1, string num2) {
        string temp = "";
        if (num1 == "0" || num2 == "0") {
            return "0";
        }
        if (num1 == "1") {return num2;}
        if (num2 == "1") {return num1;}
        string sum = "";
        vector<string> allRes;
        for (int i = num1.size() - 1; i >= 0; i--) {
            if (num1[i] == '0') {
                temp += "0";
                continue;
            }
            string s = charMultiStr(num2, num1[i]);
            s += temp;
            temp += "0";
            sum = add(sum, s);
        }
        return sum;
    }
};

時間複雜度O(mn+n^2) 其中m是num2的長度, n是num1的長度。需要從右往左遍歷num1, 對num1的每一位都要和num2計算乘積, 時間複雜度為mn,字串相加操作共有 n 次,相加的字串長度最長為 m+n,因此字串相加的時間複雜度是 O(mn+n^2),總時間複雜度是 O(mn+n^2)

空間複雜度O(m+n)空間複雜度取決於儲存中間狀態的字串,由於乘積的最大長度為m+n,因此儲存中間狀態的字串的長度不會超過m+n