《劍指offer》筆記 第5章(5)

2021-08-07 09:10:05 字數 2501 閱讀 5677

面試題50:第乙個只出現一次的字元

題目一:實現函式,找出字串中第乙個只出現一次的字元,如「abaccdeff」,輸出b

測試用例:

功能測試:字串所有字元都出現多次;字串中所有字元都出現一次;字串中存在只出現一次的字元;

特殊輸入:字串為null;

分析:

1.    從頭掃瞄字元,拿到乙個字元後,與其後面的字元比較,如果沒有重複的字元,則它是第乙個出現一次的字元;時間複雜度是o(n^2);

2.    以空間換時間,用乙個陣列(雜湊表)存放每個字元出現的次數;陣列的下標是字元的ascii值(char的長度是8bit,一共有256中字元,陣列的大小是256);空間大小即輔助陣列大小是常數,因此空間複雜度是o(1);

3.    第一次掃瞄,填寫輔助陣列,時間複雜度o(n);

4.    第二次掃瞄,找出第乙個次數是1的字元,時間複雜度是o(n);一共時間複雜度是o(n);

可以用相似方法解決的題目:

1.    從第乙個字串中刪除在第二個字串中出現過的所有字元。

2.    刪除字串中所有重複出現的字元。

3.    變位詞:兩個單詞中出現的子相同,出現次數也相同,如evil和live;實現函式,判斷輸入的兩個字串是否是互為變位詞。

題目二:實現函式,找出字元流中第乙個只出現一次的字元。字元只能乙個接著乙個從字元流中讀出。

測試用例:

功能測試:讀入乙個字元;讀入多個字元;讀入的所有字元都是唯一的;讀入所有字元都是重複的;

特殊輸入:讀入0個字元;

分析:

1.    用乙個陣列occurrence[256](雜湊表)存放字元在字元流中的位置;陣列的下標是字元的ascii值(char的長度是8bit,一共有256中字元,陣列的大小是256);

2.    陣列初始化為-1,如果字元第一次出現,則將occurrence[i]更新為字元在字元流中的位置;如果字元不是第一次出現,則將occurrence[i]更新為-2;

3.    當需要找出到目前位置從字元流中讀出的所有字元中第乙個不重複字元時,掃瞄陣列occurrence[256],找到最小的大於等於0的值;

面試題51:陣列中的逆序對

實現函式,輸入乙個陣列,找出這個陣列中的逆序對的總數。

測試用例:

功能測試:遞增排序的陣列;遞減排序的陣列;包含重複數字的陣列;未排序陣列;

邊界測試:陣列中只有兩個數字;陣列中只有乙個數字;

特殊輸入:陣列未null;

分析:

1.    如果對每個數字,與其後的數字比較,計算出逆序對數目,時間複雜度是o(n^2);

2.    統計逆序對的數目與歸併排序的思路相似:將陣列平均分成兩部分,統計左半部分的逆序數並排序,統計右半部分的逆序數並排序;將左右兩部分合併,統計逆序數並排序;這是乙個遞迴過程;

3.    合併左右兩部分的方法是從後往前複製:維護3個指標,p1最初指向左半部分最大值,p2最初指向右半部分最大值,p3指向合併陣列的將要插入的位置,最初指向最右側;*p1如果大於*p2,則說明逆序對數增加右半部分*p2往前到第乙個數字的數字個數,*p3=*p1,p1前移一位;*p1如果小於等於*p2,逆序數不增加,*p3=*p2,p2前移一位;直到p1移出左半部分邊界或p2移除右半部分邊界;

4.    最後將剩餘左半部分或右半部分的數字加入到合併陣列中,返回的逆序數是左半部分逆序數+右半部分逆序數+新增加的逆序數

面試題52:兩個鍊錶的第乙個公共節點

實現函式,輸入兩個鍊錶,找出它們的第乙個公共節點。

鍊錶定義:struct listnode

測試用例:

功能測試:兩個鍊錶有公共節點;兩個鍊錶沒有公共節點;第乙個公共節點是鍊錶的頭節點;第乙個公共節點在鍊錶中間;第乙個公共節點在鍊錶尾;

特殊輸入:煉表頭節點是null;

分析:

1.    鍊錶是單向的,從第乙個公共節點往後,鍊錶是重疊的,拓撲形狀是乙個y的形狀;

2.    如果從後往前找到最後乙個公共相同節點就是第乙個第乙個公共節點;需要兩個輔助棧,將兩個鍊錶的節點分別放入兩個輔助棧中;比較棧頂的節點,相同則彈出,比較下乙個,直到最後乙個相同節點;空間複雜度是o(m+n),時間複雜度是o(m+n);

3.    另一種方法:第一次遍歷,遍歷兩個鍊錶,得到兩個鍊錶的長度;第二次遍歷,較長的鍊錶先走若干步,同時遍歷兩個鍊錶,直到遇到相同的節點,就是第乙個公共節點;時間複雜都市o(m+n);

面試對時間複雜度和空間複雜度都有要求,通常更關注時間複雜度;

降低時間複雜度的方法有:尋找更高效的演算法;以空間換時間;

以空間換時間要注意輔助空間的大小,關注問題的背景,嵌入式開發要注意空間的消耗;

《劍指offer》筆記 第5章(2)

面試題42 連續子陣列的最大和 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o n 例如,陣列為,和最大的子陣列為,輸出位18。測試用例 功能測試 陣列中有正數也有負數 陣列中只有正數 陣列中只有負數 特殊輸入 陣列為nu...

《劍指offer》筆記 第4章(4)

面試題36 二叉搜尋樹與雙向鍊錶 輸入一棵二叉搜尋樹,將二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新的節點,只能調整樹中的節點指標指向。測試用例 功能測試 完全二叉樹 只有左 右子樹 只有乙個節點的二叉樹 特殊輸入 二叉樹根節點是null 分析 1.二叉樹中每個節點有兩個指標分別指向左子節...

《劍指offer》筆記 第6章(1)

6.1面試官談能力 溝通能力 禮貌平和 不卑不亢 邏輯清晰 詳略得當地表達 發現問題並主動發問 學習能力 對做過的專案了解深入 對面試題快速尋找解決方法 考查溝通能力 介紹過往專案 講解設計思路和 考查學習能力 提問沒有接觸過的問題 看書 關注什麼 得到暗示後迅速做出反應並糾正 6.2溝通能力和學習...