常考面試題之兩個字符串相加(長整數相加)


  無論你面試的是什么崗位,應該都或多或少看到過這個問題 - 兩個長整數相加要怎么實現。如果a和b的位數不大,確實直接用類型轉換就可以求出a+b了,但是萬一a和b的位數都是幾百位呢,早就溢出了,這時候要怎么計算呢?

  這種情況下,有三種解決方法可供選擇:

  一、 用字符串來存儲a和b的值;

  二、 用數組來存儲a和b的值;

  三、 用鏈表來存儲a和b的值。

  這三種方法都有一個共同點,就是無論哪一種方法,都可以不用擔心因為數字太大而造成數值溢出出錯。而它們的解決思路也都大同小異,下面我們來分析解決思路。

  做這種題的時候,我有一個慣性思維,就是用我們現實中的解題思路來教給計算機,讓它也用這種方法來解決。回憶一下我們小學的時候,老師是不是教我們做加法的時候,要從最后一位開始加,遇到十的時候就要進行進位,直至兩個數都加完。在編程中,我們也可以用這個思路來進行做題:

  先找到a和b的最后一位,將這兩個一位數相加並假設它存在tmp中,如果tmp大於9,那么就說明需要進位了,這時候加入一個標識表示是否需要進位,比如說我們拿addOne作為標識,那么這時候我們就需要將addOne置為1,然后tmp對10進行取模,就可以得到當前位置上的實際數值了,再對a和b的倒數第二位進行重復的操作...直至將a和b遍歷完就結束。下面這段代碼是用第二種方法來解決的,大家可以參考一下:

 1 // 方法二:將數字轉化為數組再進行相加
 2 function add(num1, num2){
 3     // 將num1和num2轉為數組,每格存儲一位,比如num1 = “12345”,轉成數組a之后就變成["1", "2", "3", "4", "5"]
 4     let a = String.prototype.split.call(num1, "");
 5     let b = String.prototype.split.call(num2, "");
 6     // 用來存儲結果
 7     let res = [];
 8     let addOne = 0; //用於判斷是否需要金威
 9     // 當a和b其中一個不為空時,各取出最后一位數字並相加,如果其中一個先為空了,則將它置為0
10     while(a.length || b.length){
11         let item1 = parseInt(a.pop()) | 0;
12         let item2 = parseInt(b.pop()) | 0;
13         let tmp = item1 + item2 + addOne;
14         if(tmp > 9){
15             addOne = 1;
16             tmp %= 10;
17         }else{
18             addOne = 0;
19         }
20         // unshift是js中的一個操作方法,array.unshift(item)表示在數組array的最前面插入item
21         res.unshift(tmp)
22     }
23     // 當a和b都全部加完了之后,再最后一次判斷是否需要進位
24     if(addOne) res.unshift(1);
25     // 最后利用join把數組轉成字符串並返回
26     return res.join('');
27 }

  其他兩種方法做起來也都大同小異,思路是一樣的,只不過是實際操作起來的方法會有所不同,大家可以自己探索一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM