Win10 Linux子系統安裝MySQL
阿新 • • 發佈:2021-01-17
題目:給定兩個以字串形式表示的非負整數num1
和num2
,返回num1
和num2
的乘積,它們的乘積也表示為字串形式。
示例:
輸入: 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; } };
時間複雜度 其中m是num2的長度, n是num1的長度。需要從右往左遍歷num1, 對num1的每一位都要和num2計算乘積, 時間複雜度為mn,字串相加操作共有 n 次,相加的字串長度最長為 m+n,因此字串相加的時間複雜度是 ,總時間複雜度是
空間複雜度空間複雜度取決於儲存中間狀態的字串,由於乘積的最大長度為m+n,因此儲存中間狀態的字串的長度不會超過m+n