日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----字符串乘法

發(fā)布時間:2024/4/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----字符串乘法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原題鏈接Multiply Strings

意思是給兩個字符串,代表兩個整數(shù),求這兩個整數(shù)的積,以字符串的形式返回
主要注意的地方在這兩個字符串可能很長,遠(yuǎn)遠(yuǎn)超過了long long int所表示的范圍,所以當(dāng)初耍小聰明直接用std::stringstream獲取兩個整數(shù)再相乘就果斷的溢出了


所以這種問題還是實打?qū)嵉挠米址嬎惚容^好,當(dāng)然需要點(diǎn)技巧,算法題很少用蠻力法硬算的…
首先還是找規(guī)律,對于字符串1的某一位乘字符串2的某一位,乘積的結(jié)果在整個結(jié)果的哪一位呢,能不能找到某種規(guī)律直接定位,這樣就簡單多了。
先看一下乘法運(yùn)算

/* 以下a * b表示num1[a] * num2[b] */ num1[0] num1[1] num1[2] * num2[0] num2[1] num2[2] --------------------------------------------------0 * 2 1 * 2 2 * 20 * 1 1 * 1 2 * 1 0 * 0 1 * 0 2 * 0 ----------------------------------------------------------

上式中直接用下標(biāo)代表對應(yīng)位的值,乘號左邊代表num1的值,右邊代表num2的值,比如0 * 1代表num1[0] * num2[1]
注意這里,0*0中0+0=0,正好是結(jié)果的第0位,0*1中0+1=1,1*0中1+0=1剛好是結(jié)果的第1位
所以根據(jù)下標(biāo)很容易定位到結(jié)果的位置
又因為0*0可能會進(jìn)位,所以在結(jié)果中每一位都后移一位,即0*0是第1位….,第0位用來存最后的進(jìn)位
這樣代碼就容易寫出了

class Solution { public:string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0")return "0";int n1 = num1.size();int n2 = num2.size();string res(n1 + n2, '0');for(int i = n1 - 1; i >= 0; --i){for(int j = n2 - 1; j >= 0; --j){int lhs = num1[i] - '0';int rhs = num2[j] - '0';/* 這里要注意的問題時,當(dāng)把進(jìn)位加給res[i+j]時,res[i+1]仍然可能繼續(xù)向高位進(jìn)位 *//* 但是不需要直接處理這種情況,在下次處理到res[i+j]時,一定會將進(jìn)位進(jìn)到高位 *//* 因為res[i+j]一定在res[i+j+1]后面處理 */int num = lhs * rhs + (res[i + j + 1] - '0');res[i + j + 1] = (num % 10) + '0';res[i + j] = res[i + j] + num / 10;}}/* 比如兩個3位數(shù)相乘結(jié)果位數(shù)可能是5位或6位,6位時是次高位向高位有進(jìn)位,此時res中沒有前導(dǎo)0 *//* 而5位時說明沒有進(jìn)位,那么res[0]將是0,結(jié)果應(yīng)該把這個前導(dǎo)0去掉,因為初始時res設(shè)成6位 */return res.substr(res.find_first_not_of('0'));} };

總結(jié)

以上是生活随笔為你收集整理的每天一道LeetCode-----字符串乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。