零散的思緒。另外,推薦《劍指offer》。本文初期大部分思考都從劍指引起。ios
面試題不僅僅只是用來面試。其中有不少編程的經驗能夠學習。就如同咱們當年的考試:)程序員
1:魯棒性的一個方面:邊界條件和異常處理。面試
1,魯棒性:robust的中文音譯。自己就是健全性。算法
2,面試中,常常出現一些簡單的代碼。考驗的就是一個程序員對邊界條件和異常處理的考慮。編程
例如:字符串轉化爲整數。自己題目很是簡單。但,咱們應該可以考慮到異常輸入有:英文/未知符號,負數,空指針,超大數值。數組
另外,須要明確題目。若是面試官的要求是:字符串轉化爲數字。須要問清楚,整數,仍是浮點?。。。固然,也可能弄巧成拙,原本面試官只是想整數,但你既然問了,那就成全你吧:(服務器
若是是浮點,咱們可能還要考慮,精度缺失的問題。咱們就要考慮double的精度。數據結構
3,對於鏈表,邊界中最不容易考慮的應該是:鏈表項數。函數
例如:查找倒數K項,但實際鏈表項數 < K。學習
2:對數組操做的一些胡思亂想。
1,C++數組最麻煩的一點是下標超出。咱們固然能夠用vector解決。但面試中,經常用這種事情來玩你。。。
2,我對數組的遍歷,常常是for循環+數組個數。數組各數一般使用宏定義。但,這並不能解決超出問題。好比:把14打成15這種低級錯誤。因此,是否可以有使用一種方式解決此問題?下面是我對此想法的一個嘗試。
/********************************************************** * \file array_t.cpp * \brief * \note * * \version * \author zheng39562@163.com ***********************************************************/ #include <iostream> using namespace std; int main( int argc, char **argv ) { int array[] = { 0, 1, 2, 3, 4}; int iNumOfarray = sizeof( array ) / sizeof( array[0] ); cout << iNumOfarray << endl; for( int i=0; i<iNumOfarray; i++) { cout << array[i] << endl; } }
1)此代碼中,嘗試用sizeof來解決循環問題。但我沒法肯定,此方法是否會有其餘瑕疵。
2)固然,更好的方法是使用vector。此代碼僅是一個簡單的討論性問題。若是有人對此有什麼想法。但願可以聯繫我(評論或郵件)。
3)另外,此方法不使用將數組指針做爲形參的函數,由於經過函數傳遞的數組,會在函數中自動退化成爲普通的指針類型。
3:對於C++常量字符串的一個疑惑。
/********************************************************** * \file string_t.cpp * \brief * \note * * \version * \author zheng39562@163.com **********************************************************/ #include <iostream> #include <stdlib.h> using namespace std; int main( int argc, char **argv ) { char str1[] = "Hello world."; char str2[] = "Hello world."; char *str3 = {"Hello world."}; char *str4 = {"Hello world."}; if( str1 == str2 ) cout << "1==2" << endl; else cout << "1!=2" << endl; if( str3 == str4 ) cout << "3==4" << endl; else cout << "3!=4" << endl; exit( 0 ); }
1)這段代碼。最終執行的結果是:1!=2 3==4。劍指(指代劍指offer此書。本文再也不重複)中指出,C++在常量字符串上進行了必定優化——str3/4指向同一個地址。我比較好奇的是,C++如何優化此問題。
2)計算機如何將str3和str4識別成同一個字符串?
3)此問題,可能涉及到編譯,執行和代碼內存分配等問題。我的暫時沒法解答。留於此,做爲記錄。
4:對於C++字符串的一些補充。
1,一個空字符串中依然包含一個'\0'。已經通過代碼證明。
5:移動數據的一種方法:當從前日後移動數據,可能須要重複屢次時;最好反置進行移動。由於從前日後移動時,不少數據會經歷屢次向後移動的經歷。這點,對於字符串和數組操做尤爲有效。
6:對於指針,必須判斷其是否爲NULL。在劍指中2.3.3鏈表的添加節點函數中,並無對指向指針的指針進行判斷。也許是由於經驗性常識,但我我的認爲此代碼並不完美。由於指向指針的指針,也一樣須要判斷。
1,存在一個疑問:對空指針取地址,獲得的結果是否和OS具體實現有關?
7:對於劍指鏈表的一個另類思路的嘗試。
1,原由:劍指中,嘗試使用AddtoTail一個函數完成添加操做。它能夠完成添加功能,但同時也完成了鏈表的建立。代碼以下(實現代碼省略):
void AddToTail( ListNode** pHead, int value ) { // contents.... if ( *pHead == NULL ) // contents... }
1)使用指向指針的指針的緣由是:當往一個空鏈表中插入頭節點時,若是使用鏈表頭做爲指針,會致使咱們丟失鏈表頭。(具體解釋,能夠查看劍指offer——或者email本人)
2)而個人問題是,若是pHead自己就是NULL,這個函數會怎麼樣?劍指中,對於空指針異常警戒,因此對於此,我存有疑惑。是不是C++語言體系中,已經可以保證NULL指針能夠指向NULL?
3)若是如上猜想,爲什麼在removeNode函數中,又對phead自己進行了判斷?
4)模擬性質的對此函數進行調用,發現彷佛須要在外面先建立一個ListNode**的指針。用new?或者仍是能夠直接NULL。感受此函數很是模糊不清。若是使用new,感受畫蛇添足。
2,對此函數,有兩個想法。
1 first mode ListNode* AddToTail( ListNode* pHead, int value ) // 若是傳入指針爲空,則直接返回一個頭指針。使用返回值來獲取頭指針。 2 second mode ListNode* CreateList( int value ); void AddToTail( ListNode* pHead, int value ); // 相信都看的懂 :) // 我的傾向此方法。雖然使用一個函數解決看起來更簡潔。但我更喜歡將行爲拆解。
1)我的沒法認同劍指的鏈表函數,即便NULL真的指向NULL。即便使用該函數不會形成錯誤——但從邏輯上,很不美好:(
3,另外,挺喜歡劍指面試4中的環形鏈表。
8:遇見過的面試中,大部分公司都喜歡考遞歸。但,須要注意,現實中使用遞歸須要考慮棧溢出的問題。除非比較肯定不會溢出,不然現實中仍是少用遞歸吧。(固然,面試時仍是使用遞歸比較好)
9:面試題6的細節記錄:
1,使用前序和中序數組來構建二叉樹。大體思想再也不分析,但須要注意異常輸入。例如:前序中自己存在錯誤數據。此時,使用你的函數,是否可以拋出一個錯誤?
2,雖然再異常和邊界中已經說起其重要性,但我的編程習慣很難一時改變。在面試時,須要能夠關注此點。
3,二叉樹是否能夠經過前序+後序還原二叉樹?(我的已經嘗試,沒法解決。)
10:注意算法(特別是排序)的額外空間消耗,平均/最差時間複雜度。
1,基本的數據結構和經常使用排序算法是必須具有的知識。
11:面試題8代碼中,沒有考慮數組出錯的狀況。
1,對於排序數組的查找和搜索,須要注意重複數字的狀況。
12:使用位運算時,須要注意負整數的狀況。(一般面試不會變態到求浮點數。)負整數使用補碼形式保存數據。
13:不少鏈表問題均可以使用兩個指針解決。。。若是不行,大概能夠用3個?(玩笑。。。)
14:面試題28是一個相對複雜的遞歸方式——由於它的遞歸出口比較奇怪。
1,此題思路不難,但遞歸代碼卡了10分鐘。由於在大腦中模擬遞歸走向時出現問題。
2,使用和理解遞歸:建議將遞歸函數代碼內的遞歸函數當作已經解決的結果,而不要嘗試展開它。對於部分遞歸,模擬展開沒有問題,但另外一部分遞歸,並不適合展開。
3,遞歸有兩種模式:
1)擁有比較簡單的出口,而且結果能夠帶入上層遞歸函數中。把遞歸自己看成結果時,很容易聯想到結果。對於此類遞歸,大腦模擬展開問題不大。
2)如面試28,遞歸代碼中的遞歸函數自己就表明多種可能性,而且遞歸出口並不是0,1,2,3等等簡單解決式。當我嘗試大腦模擬打印時,發現可能性多種多樣,沒法例舉。可能反向致使思路受阻。
4,遞歸的兩個重點:
1)遞歸規則。
2)尋找遞歸出口。須要注意的是,遞歸出口有時並不是只有一個(雖然一個出口也能夠完成遞歸,但可能會有隱性減分)。
5,面試28的擴展題。(有時間將重開一章,說明碰見的問題和出現錯誤)
15:吐槽面試題37.好好的歸併排序變種成徹底想不到的奇葩題。。。
16:邏輯運算符: '!' 的返回值爲TRUE OR FALSE。
17:粗略看完劍指OFFER後的感想。
對於劍指:
閱讀完後,第一想法,是將其中的全部面試題進行整理。獲得其算法和數據結構的本質。由於面試題能夠有各種變種,但需求的算法和數據結構都是不會改變的。閱讀劍指,與其說是閱讀,理解和記憶面試題,不如說,其總結了經常使用的面試算法和結構。
18:如下無通過權威證明:
用三天的時間看玩了劍指offer。不得不說,本書寫的很是好(據說被翻譯成英文出版了。不知真假)。
但劍指中,實際上還有不少不少缺陷的地方。倒不是書的問題。而是知識點實在太多。劍指偏向於算法以及代碼細節的處理(如異常等)。但對具體語言就有很大欠缺,須要其餘面試題補充。
面試不單是拿OFFER。一個合格的公司,它拿出的面試題自己應該有必定的傾向性。例如,我但願獲得服務器相關的崗位。但對於此行業,我只知道很是粗淺的概念知識。解答面試的同時,一樣須要關注面試題的中包含的知識傾向。