1. 程式人生 > >LeetCode總結 -- 高精度篇

LeetCode總結 -- 高精度篇

我們常見的一些基本的資料結構比如整型int或者浮點型float由於位數過多無法用內建型別儲存,這時候我們就需要自己實現高精度的資料型別來進行儲存和運算。這種問題在實際產品中還是比較實用的,所以相對來說也是面試中的常客。LeetCode中關於高精度的題目有以下幾道:
Add Binary
Add Two Numbers
Plus One
Multiply Strings

Add BinaryAdd Two Numbers是同一型別的題目,都是高精度中的加法運算,只是一個是二進位制的,一個是十進位制的,其實進位制是無所謂的,程式碼基本可以統一起來用一種思路來實現。思路也很簡單,就是從低位開始相加,一直維護進位就可以了。屬於考察非常基本的陣列操作,沒有什麼演算法難度,主要看看coding實現能力。


Plus One也是一道常見的題目,他其實就是實現C++中++的運算子,因為只需要+1,所以其實比上面的題目更加簡單。這道題的小陷阱就是它是用陣列從高位到低位進行儲存的,所以如果出現進位,那麼需要重新分配空間,並給最高位賦1,其他位賦0即可。這裡恰好引入一個點,就是高精度儲存應該低位到高位儲存還是反過來好,這也是面試中可能問到的問題。

Multiply Strings這道題是高精度的乘法運算,屬於比較複雜的,需要對每一位的結果分別計算累加,其中的細節有點多,這裡就不細說了,個人認為實現有點複雜,並不是很適合在面試中出現。

雖然說題目不多,但是這類題目的出現率卻是非常高的,主要原因倒不是這種題目本身有很多的考點,而是它們特別好擴充套件,基本上來說問到這種題目,首先是考察一下coding能力,一般來說都是這種加減乘除的運算,接下來一定會是關於資料結構(或者說面向物件)的設計。這些題目的本身都是為高精度BigInteger服務的,面試官會問一些關於這個資料結構設計的問題,比如說如果讓你來設計這個類,用什麼資料結構來存(比如陣列還是連結串列,各有什麼利弊),需要哪些介面(建構函式,加減乘除運算等等),還有比如要設計建構函式,需要什麼介面的建構函式(這裡賦值建構函式,賦值運算子這些肯定是需要的,但是要注意必須提供對於常規型別比如int,long這些的介面,一個好的高精度類肯定是要對比它更弱的資料結構進行相容的)。上面我列舉了一些可能在面試中會被繼續考查的問題,也是一部分聯想,像這種設計問題可以問得還是比較多的,也是非常常見的,大家可以自己多進行這種問題的準備和聯想哈。