列表以及字符串加法

dcq.jpeg

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

Output: 7 -> 0 -> 8

?
這個問題比較核心的一點是對進位(carry)的處理,處理好了進位(carry)也就沒什么難度了贯莺。
同時十电,還要注意一下幾個特殊的鏈表

  1. 兩個不一樣長的

    l1 = [0, 1];

    l2 = [0, 1, 2];

  2. 有一個是空列表的情況

    l1 = []

    l2 = [0, 1]

  3. 多次進位的情況(這個狀況是最容易被遺漏的)

    l1 =[9, 9]

    l2 = [1]

直接上代碼

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            if (l1 == null)
                if(l2 != null) {
                    return addTwoNumbers(l2, new ListNode(0));
                } else {
                    return null;
                }
            if (l2 == null) {
                if(l1!=null) {
                    return addTwoNumbers(l1, new ListNode(0));
                } else {
                    return null;
                }
            }
            int val = l1.val + l2.val;
            ListNode head = new ListNode(val%10);
            int carry = val / 10;
            if(carry > 0) {
                if(l1.next == null) {
                    l1.next = new ListNode(carry);
                } else {
                    l1.next.val += carry;
                }
            }
            head.next = addTwoNumbers(l1.next, l2.next);
            return head;
      }

擴展一下

Given two binary strings, return their sum (also a binary string).

For example,

a = "11"

b = "1"

Return "100".

類似于二進制的加法核心跟上一個算法沒有太多區(qū)別。


 public String addBinary(String a, String b) {
        if(a == null || a.equals(""))return b;
        if(b == null || b.equals(""))return a;
        StringBuilder stringBuilder = newStringBuilder();
        int i = a.length() - 1;
        int j = b.length() - 1;
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if(i >= 0) sum += a.charAt(i--)- '0';
            if(j >= 0) sum += b.charAt(j--)- '0';
            stringBuilder.append(sum%2);
            carry = sum / 2;
        }
        if(carry != 0)stringBuilder.append(carry);
        return stringBuilder.reverse().toString();
    }

結(jié)束了加法也搓,我們來看看乘法

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note:

  • The numbers can be arbitrarily large and are non-negative.
  • Converting the input string to integer is NOT allowed.
  • You should NOT use internal library such as BigInteger.

這里我們觀察一下倘潜,能得到結(jié)論:

num1[i] 和num2[j] 的乘積會放置在indices[i+j, i+j+1]的位置

說起來比較抽象漆际,我們看圖:

字符串乘法演示.jpg

代碼實現(xiàn)如下:

public String multiply(String num1, String num2) {
    int m = num1.length(), 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, p2 = i + j + 1;
            int sum = mul + pos[p2];
            pos[p1] += sum / 10;
            pos[p2] = (sum) % 10;
        }
    }  
    
    StringBuilder sb = new StringBuilder();
    for(int p : pos) if(!(sb.length() == 0 && p == 0)) sb.append(p);
    return sb.length() == 0 ? "0" : sb.toString();
}

更清晰的代碼實現(xiàn):

public Stringmultiply(String num1, String num2) {
        char[] s1 = num1.toCharArray();
        char[] s2 = num2.toCharArray();
        int len1 = s1.length;
        int len2 = s2.length;
        int[] ans = new int[len1 + len2];
        for (int i = len2 - 1; i >= 0; i--){
            for (int j = len1 - 1; j >= 0;j--) {
                ans[len1 + len2 - i - j - 2] +=(s2[i] - '0') * (s1[j] - '0');
            }
        }

        for (int i = 0; i < len1 + len2 - 1;i++) {
            ans[i + 1] += ans[i] / 10;
            ans[i] %= 10;
        }

        StringBuilder stringBuilder = newStringBuilder();
        int i = len1 + len2 - 1;
        while (i >= 0 && ans[i] ==0)
            i--;
        if (i < 0)
            return "0";
        while (i >= 0) {
            stringBuilder.append(ans[i]);
            i--;
        }
        return stringBuilder.toString();

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末意蛀,一起剝皮案震驚了整個濱河市耸别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌县钥,老刑警劉巖秀姐,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異若贮,居然都是意外死亡囊扳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門兜看,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狭瞎,你說我怎么就攤上這事细移。” “怎么了熊锭?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵弧轧,是天一觀的道長雪侥。 經(jīng)常有香客問我,道長精绎,這世上最難降的妖魔是什么速缨? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮代乃,結(jié)果婚禮上旬牲,老公的妹妹穿的比我還像新娘。我一直安慰自己搁吓,他們只是感情好原茅,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堕仔,像睡著了一般擂橘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摩骨,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天通贞,我揣著相機與錄音,去河邊找鬼恼五。 笑死昌罩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的唤冈。 我是一名探鬼主播峡迷,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼你虹!你這毒婦竟也來了绘搞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤傅物,失蹤者是張志新(化名)和其女友劉穎夯辖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體董饰,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蒿褂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卒暂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄栓。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖也祠,靈堂內(nèi)的尸體忽然破棺而出昙楚,到底是詐尸還是另有隱情,我是刑警寧澤诈嘿,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布堪旧,位于F島的核電站削葱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淳梦。R本人自食惡果不足惜析砸,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爆袍。 院中可真熱鬧首繁,春花似錦、人聲如沸螃宙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆扎。三九已至挂捅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間堂湖,已是汗流浹背闲先。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留无蜂,地道東北人伺糠。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像斥季,于是被迫代替她去往敵國和親训桶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗酣倾。 張土汪:刷leetcod...
    土汪閱讀 12,747評論 0 33
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,554評論 0 23
  • 中午起床的孩子不想吃飯可以試試這個白粥你舵揭,是感冒沒胃口最好的食糧了! 首先將豬肉剁成肉沫躁锡,根據(jù)個人喜好調(diào)整肉沫的細...
    kanoko閱讀 248評論 3 1
  • 高中過后午绳,舒服自由的日子就來了,沒有繁重的作業(yè)映之,沒有家長老師的叮嚀拦焚,一切生活隨心所欲。迎來生命第二春(第一春在襁褓...
    子暮言閱讀 375評論 4 2
  • 我從未如此認真的感到榮幸 虔誠翹首杠输,頂禮膜拜 一步一叩頭 一步一作揖 唐卡之上的風馬旗咧咧作響 我則如同一個喇嘛 ...
    Mr橘子閱讀 346評論 4 2