Leetcode - Multiply Strings

![Uploading Paste_Image_697854.png . . .]

My code:

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0)
            return null;
        int len = num1.length() + num2.length();
        int[] carry = new int[len];
        for (int i = num1.length() - 1; i >= 0; i--) {
            int temp1 = num1.charAt(i) - 48;
            for (int j = num2.length() - 1; j >= 0; j--) {
                int temp2 = num2.charAt(j) - 48;
                int mul = temp1 * temp2;
                int baseI = num1.length() - i - 1;
                int baseJ = num2.length() - j - 1;
                carry[baseI + baseJ] += mul;
                carry[baseI + baseJ + 1] += carry[baseI + baseJ] / 10;
                carry[baseI + baseJ] = carry[baseI + baseJ] % 10;
            }
        }
        if (carry[len - 2] >= 10) {
            carry[len - 1] = carry[len - 2] / 10;
            carry[len - 2] = carry[len - 2] % 10;
        }
        int resultLen = 0;
        if (carry[len - 1] == 0)
            resultLen = len - 1;
        else
            resultLen = len;
        String str = "";
        for (int i = resultLen - 1; i >= 0; i--)
            str += (char) (carry[i] + 48);
        for (int i = 0; i < resultLen; i++) {
            if (str.charAt(0) == '0') {
                if (i != resultLen - 1)
                    str = str.substring(1, str.length());
            }
            else
                break;
        }
        return str;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.multiply("1234", "0"));
    }
}

My test result:

這次作業(yè)思路不難,就是實(shí)現(xiàn)起來(lái)有點(diǎn)繁雜。具體如下秃殉。我的例子是

                       1 2 3 4 *
                          5 6 7
_________________________________
                       x x x x
                    x x x x
                 x x x x
-----------------------------
              x x x x x x x
我設(shè)置了一個(gè)carry數(shù)組來(lái)記錄每一次乘法后的結(jié)果。
比如第一次是郭脂, 1 2 3 4 *
                   7
                  -------------
             8 6 3 8
那么 carry [7]----   7 6 5 4 3 2 1 0
               ->    0 0 0 0 8 6 3 8

然后第二輪相乘是稽荧, 1 2 3 4 *
                     6
-------------------------------

那么首先橘茉, 4 * 6 = 24; 再加上原先此位的carry[1] = 3; 即姨丈,
                 24 + 3 = 27畅卓; 將大于等于10的進(jìn)位到前一位,
          2 -> 進(jìn)位到前一位蟋恬, 即 carry[baseI + baseJ + 1] = carry[baseI + baseJ] / 10;
          7 -> 保留在當(dāng)前carry位髓介。
于是,carry [7]----   7 6 5 4 3 2 1 0
                     0 0 0 0 8 6 3 8
                 ->  0 0 0 0 8 8 7 8

然后接著進(jìn)行 3 * 6 = 18;那么carry變化為:
      carry [7]   ----   7 6 5 4 3 2 1 0
                         0 0 0 0 8 6 3 8
                         0 0 0 0 8 8 7 8
                   ->    0 0 0 0 10 6 7 8

2 * 6 = 12筋现;
      carry [7]   ----   7 6 5 4 3 2 1 0
                         0 0 0 0 8 6 3 8
                         0 0 0 0 8 8 7 8
                         0 0 0 0 10 6 7 8
                  ->     0 0 0 2 2 6 7 8
1 * 6 = 6唐础;
      carry [7]   ----   7 6 5 4 3 2 1 0
                         0 0 0 0 8 6 3 8
                         0 0 0 0 8 8 7 8
                         0 0 0 0 10 6 7 8
                         0 0 0 2 2 6 7 8
                ->       0 0 0 8 2 6 7 8

這個(gè)結(jié)果就是 1234 * 67的
之后多了一個(gè)5,也是以此類推矾飞。

**
總結(jié):這次題目還好了一膨。
記住了, 數(shù)字0 到字符0洒沦, 相差dec(48)豹绪, OX30.
字符0 - 9 : OX30 - OX39 0 - 9
字符A - Z : OX41 - OX5A 65 - 90
字符a - z : OX61 - OX7A 97 - 122
所以,字符A到a 相差:相差dec(32)申眼, OX20.
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0)
            return null;
        /** move insignificant digits to left, easy to be operated later */
        StringBuilder num1StrB = new StringBuilder(num1).reverse();
        StringBuilder num2StrB = new StringBuilder(num2).reverse();
        int[] ret = new int[num1.length() + num2.length()];
        /** calculate every multiplication, store results into every digit including carry */
        for (int i = 0; i < num1StrB.length(); i++) {
            for (int j = 0; j < num2StrB.length(); j++) {
                ret[i + j] += (num1StrB.charAt(i) - '0') * (num2StrB.charAt(j) - '0');
            }
        }
        
        StringBuilder sb = new StringBuilder();
        /** deal with carry. separate carry and mod from each digit */
        for (int i = 0; i < ret.length; i++) {
            int mod = ret[i] % 10;
            int carry = ret[i] / 10;
            if (i < ret.length - 1)
                ret[i + 1] += carry;
            sb.insert(0, mod); // move insignificant digits to the right
        }
        /** delete meaningless 0 on the left */
        while (sb.charAt(0) == '0' && sb.length() > 1) {
            sb.deleteCharAt(0);
        }
        return sb.toString();
    }
}

看了下之前自己寫(xiě)的瞒津,好復(fù)雜。
然后看了下網(wǎng)上的答案括尸,自己寫(xiě)了下巷蚪。這種題目還是看下答案。本身沒(méi)多大意義濒翻。而且網(wǎng)上答案更加簡(jiǎn)潔易懂屁柏。
參考網(wǎng)址如下:
http://www.programcreek.com/2014/05/leetcode-multiply-strings-java/

就是先把每一位都乘一下,不進(jìn)位有送,把每個(gè)結(jié)果都保存在相應(yīng)的digit里面淌喻。
然后再統(tǒng)一處理進(jìn)位。
最后雀摘,再除去左邊多出來(lái)的一些0.
同時(shí)裸删, StringBuilder sb.insert(0, mod);
就是在index = 0 處插入mod,如果已經(jīng)有值了阵赠,就把現(xiàn)有值往右邊移動(dòng)涯塔。
deleteCharAt(0) 就是刪除index = 0 處的值乘粒,然后不停地左移。

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1 == null || num1.length() == 0 || num2 == null || num2.length() == 0) {
            return "";
        }
        
        int m = num1.length();
        int n = num2.length();
        int[] pos = new int[m + n];
        for (int i = m - 1; i >=0; i--) {
            for (int j = n - 1; j >= 0; j--) {
                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int p1 = i + j;
                int p2 = i + j + 1;
                int sum = mul + pos[p2];
                pos[p1] += sum / 10;
                pos[p2] = sum % 10;
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < pos.length; i++) {
            if (!(sb.length() == 0 && pos[i] == 0)) {
                sb.append(pos[i]);
            }
        }
        if (sb.length() == 0) {
            sb.append('0');
        }
        return sb.toString();
    }
}

reference:
https://discuss.leetcode.com/topic/30508/easiest-java-solution-with-graph-explanation

直接看的答案伤塌。很簡(jiǎn)潔。
其實(shí)更像是找規(guī)律轧铁。

Anyway, Good luck, Richardo! -- 09/19/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末每聪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齿风,更是在濱河造成了極大的恐慌药薯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件救斑,死亡現(xiàn)場(chǎng)離奇詭異童本,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)脸候,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門穷娱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人运沦,你說(shuō)我怎么就攤上這事泵额。” “怎么了携添?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵嫁盲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我烈掠,道長(zhǎng)羞秤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任左敌,我火速辦了婚禮瘾蛋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矫限。我一直安慰自己瘦黑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布奇唤。 她就那樣靜靜地躺著幸斥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咬扇。 梳的紋絲不亂的頭發(fā)上甲葬,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音懈贺,去河邊找鬼经窖。 笑死坡垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的画侣。 我是一名探鬼主播冰悠,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼配乱!你這毒婦竟也來(lái)了溉卓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搬泥,失蹤者是張志新(化名)和其女友劉穎桑寨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體忿檩,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尉尾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了燥透。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沙咏。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖班套,靈堂內(nèi)的尸體忽然破棺而出芭碍,到底是詐尸還是另有隱情,我是刑警寧澤孽尽,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布窖壕,位于F島的核電站,受9級(jí)特大地震影響杉女,放射性物質(zhì)發(fā)生泄漏瞻讽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一熏挎、第九天 我趴在偏房一處隱蔽的房頂上張望速勇。 院中可真熱鬧,春花似錦坎拐、人聲如沸烦磁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)都伪。三九已至,卻和暖如春积担,著一層夾襖步出監(jiān)牢的瞬間陨晶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工帝璧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留先誉,地道東北人湿刽。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像褐耳,于是被迫代替她去往敵國(guó)和親诈闺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

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