????????????????????????Take your time ! ????????????????????????
??個(gè)人主頁:??????大魔王??????
??所屬專欄:??魔王的修煉之路–C++??
如果你覺得這篇文章對(duì)你有幫助,請(qǐng)?jiān)谖恼陆Y(jié)尾處留下你的點(diǎn)贊??和關(guān)注??,支持一下博主。同時(shí)記得收藏?這篇文章,方便以后重新閱讀。
43. 字符串相乘
這個(gè)相當(dāng)于是字符串相加的進(jìn)階版,需要用到字符串相加實(shí)現(xiàn)的內(nèi)容。
幾個(gè)月前做過一遍都做了好幾個(gè)小時(shí),這次又做有用了好幾個(gè)小時(shí)
之前的思路是每次用完數(shù)據(jù)pop,這次的實(shí)現(xiàn)是通過對(duì)迭代器的控制
花了三四個(gè)小時(shí),無語了,總結(jié)出來就兩個(gè)大問題:
- 對(duì)于任何情況的位數(shù)0都不應(yīng)該在轉(zhuǎn)換為int時(shí)去管,因?yàn)檎蔚拇鎯?chǔ)空間就那么大,但是字符串可以無限大,所以就算不算數(shù)據(jù)部分,對(duì)于比較長的字符串最后也會(huì)把整型給撐爆,long long也不行,解決方法就是先將這一次要加的0記起來然后等要計(jì)算這次字符串相加時(shí)也就是把整型轉(zhuǎn)換為了字符串時(shí)再補(bǔ)上這一次的0.
- 不能先將其中一個(gè)字符串轉(zhuǎn)換為整型然后只用一層for循環(huán)對(duì)另一個(gè)字符串的數(shù)據(jù)進(jìn)行遍歷相加,就算是long long也接收不了每次這么大的整型,必須用兩層for循環(huán)分別讓兩個(gè)數(shù)的每位相乘完立即相加到字符串上。
給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。
注意:不能使用任何內(nèi)置的 BigInteger 庫或直接將輸入轉(zhuǎn)換為整數(shù)。
示例 1:
輸入: num1 = “2”, num2 = “3”
輸出: “6”
示例 2:
輸入: num1 = “123”, num2 = “456”
輸出: “56088”
提示:
1 <= num1.length, num2.length <= 200
num1 和 num2 只能由數(shù)字組成。
num1 和 num2 都不包含任何前導(dǎo)零,除了數(shù)字0本身。
class add {
public:
string addStrings(string num1, string num2) {
string s;
int n1 = 0, n2 = 0;
int flag = 0;
int sum = 0;
if (num1.size() == 0)
return num2;
else if (num2.size() == 0)
return num1;
string::iterator cur1 = num1.end() - 1;
string::iterator cur2 = num2.end() - 1;
while (cur1 >= num1.begin() || cur2 >= num2.begin())
{
n1 = cur1 >= num1.begin() ? *cur1 - '0' : 0;
n2 = cur2 >= num2.begin() ? *cur2 - '0' : 0;//等到越界的時(shí)候也沒事,因?yàn)槿坎僮鞣麜?huì)選擇性執(zhí)行,只會(huì)去比那塊的地址,不會(huì)訪問進(jìn)去。
sum = n1 + n2 + flag;
flag = 0;
if (sum > 9)
{
flag = 1;
sum -= 10;
}
s += sum + '0';
cur1--;
cur2--;
}
if (flag)
s += 1 + '0';
reverse(s.begin(), s.end());
return s;
}
};
class Solution {
public:
string multiply(string num1, string num2) {
if (num1 == string("0") || num2 == "0")
return string("0");
string s;
long long num1_tmp = 0;
long long num2_tmp = 0;
//不能一下子讓num1變?yōu)檎麛?shù),因?yàn)榫退闶莑ong long 也存不下,所以要套兩層循環(huán),讓它們每個(gè)位都相乘
// for (auto x : num1)
// {
// cout << (x - '0') << ' ';
// s_num1 += (x - '0') * pow(10, num1.size() - 1 - system++);
// cout << s_num1 << endl;
// }
// cout << s_num1 << endl;
int system1 = 0;
int system2 = 0;
string::iterator it1 = num1.end() - 1;
while(it1 >= num1.begin())
{
system2 = 0;
string product_s;
num1_tmp = *it1 - '0';
string::iterator it2 = num2.end() - 1;
while(it2 >= num2.begin())
{
int system = system1 + system2;
int product = 0;
num2_tmp = *it2 - '0';
product = num1_tmp * num2_tmp;
while (product > 9)
{
int n = product % 10;
product_s += n + '0';
product /= 10;
}
product_s += product + '0';
reverse(product_s.begin(), product_s.end());
for(int i = 0; i < system; i++)
product_s += '0';
// cout << s << endl;
// cout << product_s << endl;
s = add().addStrings(s,product_s);
// cout << s << endl;
product_s.clear();
system2++;
it2--;
}
system1++;
it1--;
}
return s;
}
};
- 博主長期更新,博主的目標(biāo)是不斷提升閱讀體驗(yàn)和內(nèi)容質(zhì)量,如果你喜歡博主的文章,請(qǐng)點(diǎn)個(gè)贊或者關(guān)注博主支持一波,我會(huì)更加努力的為你呈現(xiàn)精彩的內(nèi)容。
??專欄推薦
??魔王的修煉之路–C語言
??魔王的修煉之路–數(shù)據(jù)結(jié)構(gòu)初階
??魔王的修煉之路–C++
??魔王的修煉之路–Linux
更新不易,希望得到友友的三連支持一波。收藏這篇文章,意味著你將永久擁有它,無論何時(shí)何地,都可以立即找到重新閱讀;關(guān)注博主,意味著無論何時(shí)何地,博主將永久和你一起學(xué)習(xí)進(jìn)步,為你帶來有價(jià)值的內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-829533.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-829533.html
到了這里,關(guān)于LeetCode —— 43. 字符串相乘的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!