1. 程式人生 > >【面試】劍指offer題目解析及tips速查(不斷更新中)

【面試】劍指offer題目解析及tips速查(不斷更新中)

tips:右上角開始查詢,x小左移,x大下移。 tips+:陣列為空(空指標),行列<=0情況;左移和下移越界情況;引數為指標,根據記憶體儲存規則訪問陣列元素。 tips:要求在原來的字串上替換,且原始輸入字串後有足夠多的記憶體。 key1:每掃描到一個空格將後邊(O(N)個)字元右移3位,共O(N)個空格,時間複雜度O(N2)。 key2:遍歷串統計空格數,新字串長度為原長度+2*空格數,兩個指標分別指向新舊字串末尾,從後向前複製和移動指標(
O(N)) 測試用例:空格位於字串的前、後、中間;連續多個空格;沒有空格;空指標;空字串;字串是一個空格字元;字串是連續多個空格。 線上OJ練習:替換空格
tips:從後向前比較,避免從前往後複製時需要重複移動。 結點值)。P49 tips:空表;表末尾。 (提供連結串列頭指標**和新結點值)P50 tips:空表(頭指標指向的指標空)、頭指標空(連結串列不存在)、第一個結點就是所找的值、值不存在、delete p後將其NULL。
tips:用棧實現(棧不空時彈出);用遞迴實現,先遞迴列印後邊的結點,再列印本結點(連結串列較大時可能溢位)。 測試用例:多個結點的一般測試;單結點連結串列;頭結點指標NULL。 tips:前序找根節點,中序遍歷找根,遞迴為構建左右子樹後再返回根;注意用指標訪問原序列防止修改;注意兩個序列不匹配、為空、遞迴基準(只剩一個結點)、判定子樹是否為空、適當返回異常資訊(throw)。 測試用例:完全、不完全二叉樹;沒有右子、左子的二叉樹;只有一個結點;輸入NULL;前序遍歷和中序遍歷不匹配。
線上OJ練習:重建二叉樹
tips:插入一個元素時均壓入stack1;刪除一個元素時,若stack2不為空直接彈出,stack2為空時將stack1全部彈出壓入stack2。 測試用例:空佇列的插入和刪除;非空佇列的插入和刪除;連續刪除元素直至佇列為空。 tips:保持其中一個佇列為空,插入時插入非空佇列,刪除時彈出非空佇列元素並插入另個空佇列,直至剩餘最後一個元素彈出作為棧元素的彈出。 tips:新建一個長度100的陣列,下標代表年齡,陣列元素為計數。 tips:順序查詢,O(N)。 tips+:兩個指標分別指向開頭和結尾,二分法取中間元素與兩邊元素比較,確定中間元素屬於前後哪部分,把其中一個指標移到中間縮小查詢範圍,O(lgN)。三個元素均相等時無法判斷,要用順序查詢。初始要將最小元素位置賦為最左,以防不發生旋轉左不小於右時才進入迴圈;兩指標相鄰時右指標為所求。
測試用例:升序陣列的旋轉、不旋轉、有或沒有重複數字、陣列只有一個數字、NULL。
tips:不用遞迴,否則會重複計算;可以把已經得到的數列中間項儲存起來,計算過就不再計算;或者直接從小到大計算。
tips:n為1是1,n為2是2的斐波那契數列。 測試用例:一般功能測試;0、1、2的邊界測試;較大數的效率測試。
線上OJ練習:跳臺階

tips:判斷最後一位是不是1(和1與),然後右移一位,判斷最後一位,直到n為0。當輸入0x80000000會陷入死迴圈(負數右移高位會補符號位1)。 tips+:和1與判斷最後一位是不是1,將1左移,和n與判斷次低位是不是1,直到1移出左端(如32位)。 tips++:n=(n-1)&n;把一個整數減去1與原始數與運算,會把原始數最右邊的1變為0。 測試用例:正數、負數;邊界值1、0x7FFFFFFF、0x80000000、0xFFFFFFFF、0。 tips:只有一個1,(n-1)&n是0。 tips:m^n,統計結果中1的個數。 tips:考慮一般整數的負指數冪、0的負指數冪、浮點數的相等不能用'=='判斷。 tips+:n為偶數時拆分成兩個n/2次冪相乘,n為奇數時拆分成兩個(n-1)/2冪相乘再乘一次底數;右移運算代替除以2、與運算代替%判斷奇偶。 測試用例:底數和指數分別設定為整數、負數和零。 tips:求出最大數,然後迴圈列印。number每次乘10,計數器計數一次,知道計數器達到n。當n很大時long long型也可能溢位。 tips+:用字串表示數,模擬加法和列印數字;需要n+1的字串,不夠位數在前邊補0;模擬加法要考慮進位、首位溢位、char到int再到char的轉換、+1後某位無進位則剩餘的前邊幾位都無需計算;列印數字要從第一個不為零的開始列印,可以設定flag幫助標記。 tips++:每位上有0到9種選擇的全排列,用遞迴從高位開始設定,列印仍不列印開始的零。 測試用例:1、2、3……;-1、0
擴充套件:char可以表示256個字元,0-9只用了10個,是否有更高效的方式。 tips:考察輸入數字有負數。 tips:將下一個結點內容複製給該結點,刪除下一個結點;注意指標的釋放和連結串列的特殊情況。 測試用例:從多個結點的連結串列中刪除中間結點、頭結點、尾結點(O(N));連結串列只有一個結點;指向頭結點指標的指標為NULL、頭結點指標NULL、指向要刪除的結點的指標NULL;要刪除的結點不在連結串列中(O(N))。 tips:從頭到尾掃描,遇到偶數拿出臨時儲存,其餘元素前移一位,再將這個偶數放在最後。O(N2) tips+:類似快排分割維護兩側向中間移動的雙指標的方法,指標停止時交換,直到指標交匯。O(N) tips++:考慮可擴充套件性,將函式指標作為一個引數,將對資料兩種型別的判斷寫成一個函式,可以解決一類相似問題。 測試用例:奇數偶數交替出現、只有奇數或偶數、奇數均在偶數前邊、偶數均值奇數前邊、輸入NULL、陣列只有一個數字。 測試用例:第k個結點在連結串列的中間、頭、尾;連結串列頭指標NULL;結點總數少於k;k=0。 tips:雙指標,一個每次走一步,一個每次走兩步。

tips:雙指標,一個每次走一步,一個每次走兩步。走得快的追上走得慢的證明有環,走得快的到了NULL也沒有追上走得慢的,證明無環。 tips:三個指標分別指向當前結點、前一個結點、後一個結點;找到反轉後的頭結點;NULL和只有一個結點情況。 測試用例:輸入連結串列多個結點、一個結點、NULL。
線上OJ練習:反轉連結串列
tips:兩個連結串列的較小值點做頭結點,next連結是遞迴函式的返回值;注意NULL。 測試用例:兩個連結串列有多個結點,值不同或存在相同;至少一個為NULL;都只有一個結點時。
tips:遞迴函式遍歷樹A找與B根結點相同的結點,然後呼叫另一個遞迴函式判斷結構是否相同;注意遞迴終止條件和特殊情況(無左、右子等),本題中均是NULL的情況。 測試用例:A、B均是普通二叉樹且A包含或不包含B;二叉樹有一個或兩個是NULL;樹中沒有左子或右子。
線上OJ練習:數的子結構
P125 tips:前序遍歷這棵樹的每個結點,如果遍歷到的結點有子結點,就交換結點,交換完所有非葉結點就得到樹的映象。 測試用例:普通二叉樹;二叉樹所有結點無左子樹或右子樹;單結點;NULL指標。
擴充套件:用遞迴和迴圈分別實現。