2012年09月18日

哈希表

儘管哈希表不能解決所有的問題,但是面試中的大部分問題能用它解決。在面試之前一定要好好準備下哈希表的使用和實現。

2012年09月18日

數組鏈表

數 組鏈表(大小可動態變化的數組)在使用中能夠根據需要擴大數組的容量,並且能夠提供O(1)的隨機訪問效率。數組鏈表典型的一種實現方法就是:當達到數組 上限,就將數組容量擴大一倍。雖然在擴大容量時候的時間複雜度爲O(n),但是這樣情況都較少發生,所以總的時間開銷可近似爲O(1)。

2012年09月18日

字符串

問:下面這段代碼的時間複雜度?
2012年09月18日

答:O(n^2), 這裏的n爲字符串sentence中的字符的個數。理由如下:每次你在向字符串sentence串中才追加一個數組的時候,就需要重新複製一次 sentence中的字符,每次複製都需要從頭到尾遍歷一次sentence。這樣的話把所有的單詞追加到sentence中的時間複雜度爲 O(n^2)。

1.1 設計算法判斷一個字符串中字符都是否唯一的。如果不能使用額外的數據結構呢?
解答1.1:先假設字符串中的字符均爲ASCII碼(如果不是的可以增大存儲空間,而算法的邏輯是相同的)。“假設”在你的面試中非常的重要。
2012年09月18日
算法的時間空間複雜度均爲O(n),n爲字符串的長度。

採用bit序列來代替數組可以爲我們進一步節省空間。這裏我們需要假設字符串中的字符爲'a'-'z'。這樣只要用一個int型的變量就能記錄字符是否出現了。
2012年09月18日

本題還有其他的解法:
1. 檢查每一個字符在字符串中的出現次數,這樣的方法時間複雜度爲O(n^2),但是空間複雜度爲0。
2. 如果字符串中的內容可以破壞的話。我們可以將字符串中的字符排序(時間複雜度爲O(nlogn)),然後遍歷字符串中的某個字符相鄰的字符時候相同。但是要注意有些排序算法是需要額外的存儲空間的。

 1.2 實現C語言風格的字符串反轉的算法
(C語言字符串:例如“abcd”字符串爲5個字符,最後一個字符爲/0用來表示字符串結束。)
解答1.2:
這個是面試的常見問題。如果你說你懂的話,就馬上開始寫代碼吧。

2012年09月18日

1.3 設計一個算法移除字符串中的重複字符,算法不使用額外緩衝。並對你的算法設計測試用例。注意:一兩個變量使用當是OK的,但是複製整個數組就不行了。
解答1.3:
無字符串緩衝算法
1. 對每個字符判斷是否爲重複字符。
2. 重複字符直接跳過,非重複字符記錄。
時間複雜度爲O(n^2)
2012年09月18日
測試用例:
1. 無重複字符:abcd;
2. 全重複字符:aaaa;
3. 無效字符串:null;
4. 連續重複字符串:aaaabbbb;
5. 非連續重複字符串:abcabc;

字符串緩衝算法:
2012年09月18日
1. 無重複字符:abcd;
2. 全重複字符:aaaa;
3. 無效字符串:null;
4. 空字符串:empty
5. 連續重複字符串:aaaabbbb;
6. 非連續重複字符串:abcabc;

1.4 寫一個函數判斷兩個字符串是否使用相同的字符構成。
解答1.4:
本題有兩種解法
法1 排序法
2012年09月18日
法2 計數法
2012年09月18日

1.5 編寫代碼將字符串在中的空格替換爲‘ ’
解答1.5:
算法流程:
1 遍歷字符串,記錄下有多少個空格;
2 從字符串尾部重新解析:
  (1) 如果當前字符爲空格,在寫入字符串' '
  (2) 非空格則直接記錄。
2012年09月18日

1.6 給出一張圖片,表示爲NXN的居然,每個像素點爲4字節。寫一個函數實現將這張圖片旋轉90°。
解答1.6:
圖片的旋轉可以將像素劃分成一圈一圈,然後從最外層一圈一圈上來旋轉。旋轉某一圈的某個元素的時候,相當於對應的上下左右依次交換。
2012年09月18日

1.7 實現算法:在一個MxN的矩陣中,如果某一元素爲0,則將其所在的行和列都置爲零。
解答1.7:
乍一看題目,先遍歷矩陣,出現0元素,就將所在的行列置零。但是這樣的方法執行下來的話整個矩陣都變成了0了。
一個變通的方法,在另外一個MxN的矩陣中記錄是否出現零的情況,然後根據記錄對原來的矩陣中對相應的行列進行置零。可是這樣方法的空間複雜度爲O(MxN)。有沒有改進的空間呢?
經過觀察,其實我們只需要記錄哪一列和哪一行需要置零即可。那麼我們新的記錄方法即爲:使用兩個數組rows[]和col[]來記錄需要置零的行列。更具這樣的方法算法代碼如下:
2012年09月18日

1.8 假設你已經有一個函數用來 isSubstring(s1,s2) 用來判斷字符串s1是否是字符串s2的子串。那麼現在給你一個字符串s1和s2,讓你判斷s1是否是s2循環位移得到的。你的算法中只能調用一次isSubstring (比如“waterbottle”循環位移就可以得到"erbottlewat")。
解答1.8:
算法描述:
1 如果length(s1)!= length(s2) 返回 false
2 將是s1和本身連接,得到新字符串s1',調用isSubstring(s2,s1')判斷s2是否爲s1'的字符串。
2012年09月18日


發佈了55 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章