LeetCode代碼分析——43. Multiply Strings(循環(huán)迭代的控制+乘法運(yùn)算)

題目描述

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.
以字符串的形式給出兩個(gè)非負(fù)的整數(shù)num1和num2瘸洛,返回兩個(gè)數(shù)的乘積亚铁,結(jié)果同樣以字符串的形式表示。

Example 1:

Input: num1 = "2", num2 = "3"
Output: "6"

Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

Note:

The length of both num1 and num2 is < 110.
num1和num2的長度都小于110
Both num1 and num2 contain only digits 0-9.
num1和num2都只包含數(shù)字0-9
Both num1 and num2 do not contain any leading zero, except the number 0 itself.
num1和num2都不含前置的0盅称,除非本身就是0
You must not use any built-in BigInteger library or convert the inputs to integer directly.
禁止使用內(nèi)置的BigInteger庫或者直接把輸入轉(zhuǎn)化為整數(shù)榕吼。

思路分析

禁止使用內(nèi)置的BigInteger庫或者直接把輸入轉(zhuǎn)化為整數(shù)轧邪。這句話意味著不能投機(jī)取巧直接算出來拖吼,而是要自己手動(dòng)實(shí)現(xiàn)人腦版的十進(jìn)制的乘法鼻疮。(這道題做的我都忘了乘法怎么算了假勿。借嗽。。
十進(jìn)制的乘法就是從個(gè)位開始依次向上運(yùn)算废登,將結(jié)果的個(gè)位存入相應(yīng)位置(如果原來位置有數(shù)就相加)淹魄,如果有進(jìn)位就記錄進(jìn)位,然后再進(jìn)入下一個(gè)位置的運(yùn)算堡距。

運(yùn)算的過程

如圖所示甲锡,兩層循環(huán)遍歷num1和num2,使得每一位相乘羽戒,乘積(例如9 * 9 = 81)的個(gè)位(1)放入res的相應(yīng)位置缤沦,用carry記錄進(jìn)位(8),下次再計(jì)算乘積后易稠,需要將乘積與進(jìn)位carry相加缸废,如果字符串該位置有數(shù),則再加上該位置的數(shù)驶社。
如圖企量,一次循環(huán)以后,res字符串為1998(為了方便res字符串采用逆序)亡电;
兩次后届巩,res字符串為10989;
三次后份乒,res字符串為100899恕汇;
最后翻轉(zhuǎn)res腕唧。

重點(diǎn)在于縷清楚乘法運(yùn)算的進(jìn)位邏輯,兩位相乘的結(jié)果個(gè)位數(shù)應(yīng)該放入res字符串的哪一位瘾英。

代碼實(shí)現(xiàn)

public class Solution {

    /**
     * 311 / 311 test cases passed.
     *  Status: Accepted
     *  Runtime: 37 ms
     *
     * @param num1
     * @param num2
     * @return
     */
    public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        StringBuilder res = new StringBuilder(num1.length() + num2.length());
        int max_len = num1.length() + num2.length();
        int carry = 0;
        for (int i = num2.length() - 1; i >= 0; i--) {
            for (int j = num1.length() - 1; j >= 0; j--) {
                int tmp = (num2.charAt(i) - '0') * (num1.charAt(j) - '0');
                tmp = tmp + carry;
                if (res.length() <= max_len - i - j - 2) {
                    res.append((char) ('0' + tmp % 10));
                } else {
                    int cur = res.charAt(max_len - i - j - 2) - '0';
                    tmp += cur;
                    res.setCharAt(max_len - i - j - 2, (char) ('0' + tmp % 10));
                }
                carry = tmp / 10;
            }
            if (carry != 0) {
                res.append((char) ('0' + carry));
                carry = 0;
            }
        }
        return res.reverse().toString();
    }

    public String multiply2(String num1, String num2) {
        if(num1 == null || num2 == null || num1.length()==0 || num2.length()==0)
            return "";
        if(num1.charAt(0)=='0')
            return "0";
        if(num2.charAt(0)=='0')
            return "0";
        StringBuilder res = new StringBuilder();
        int num = 0;
        for(int i=num1.length()+num2.length();i>0;i--)
        {
            for(int j=Math.min(i-1,num1.length());j>0;j--)
            {
                if(i-j<=num2.length())
                {
                    num += (int)(num1.charAt(j-1)-'0')*(int)(num2.charAt(i-1-j)-'0');
                }
            }
            if(i!=1 || num>0)
                res.append(num%10);
            num = num/10;
        }
        return res.reverse().toString();
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枣接,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缺谴,更是在濱河造成了極大的恐慌但惶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湿蛔,死亡現(xiàn)場離奇詭異榆骚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)煌集,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捌省,“玉大人苫纤,你說我怎么就攤上這事「倩海” “怎么了卷拘?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祝高。 經(jīng)常有香客問我栗弟,道長,這世上最難降的妖魔是什么工闺? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任乍赫,我火速辦了婚禮,結(jié)果婚禮上陆蟆,老公的妹妹穿的比我還像新娘雷厂。我一直安慰自己,他們只是感情好叠殷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布改鲫。 她就那樣靜靜地躺著,像睡著了一般林束。 火紅的嫁衣襯著肌膚如雪像棘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天壶冒,我揣著相機(jī)與錄音缕题,去河邊找鬼。 笑死依痊,一個(gè)胖子當(dāng)著我的面吹牛避除,可吹牛的內(nèi)容都是我干的怎披。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓶摆,長吁一口氣:“原來是場噩夢啊……” “哼凉逛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起群井,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤状飞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后书斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诬辈,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年荐吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焙糟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡样屠,死狀恐怖穿撮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痪欲,我是刑警寧澤悦穿,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站业踢,受9級特大地震影響栗柒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜知举,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一瞬沦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧负蠕,春花似錦蛙埂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欲账,卻和暖如春屡江,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赛不。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工惩嘉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人踢故。 一個(gè)月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓文黎,卻偏偏與公主長得像惹苗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子耸峭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容