算法系列:

一、java

1.1 10萬份數據,分紅10份,每份1萬個python

1.2 替換字符串中的空格ios

1.3 查找郵件地址c++

 

二、程序員

2.1 數組中和最大的子序列面試

2.2 數組中個數超過一半的數字算法

2.3 全排列編程

2.4 1000瓶水,1個有毒數組

 

三、網絡

3.1 計算1+2+3+……+N

3.2 刪除鏈表中倒數第K個點

3.3 判斷兩個鏈表是否相交

3.4 求數組中最大最小值

3.5 用COPY-ON-WRITE寫STRING類

 

---------------------------------------------------------------------------------------

 

一、C++ 基礎知識

類的內存佈局,vtable的原理,虛繼承的時候類內存佈局,多繼承的時候類的佈局。另一個重點在內存部分,只要跟內存相關的都喜歡考,對指針的理解,allocator的實現,vector內存分配的策略,各類智能指針實現原理及其使用注意事項, rule of three, RAII,內存泄漏的原油時候如何調試等等。較多涉及指針、多態(虛函數表、內存 layout等)、做用域、內存的管理等。
vector增加模式、虛函數表、函數指針複雜形式的識別、HASH的設計

從最基礎的c++基礎語法知識以及stl原理,到初級的多態的實現,再到高級的內存模型,c++11的新特性,最後到模板編程,

算法、多線程、SOCKET、內存管理


以C++的虛函數爲例。瞭解多態麼?它是怎麼實現的?何時應該使用它?在語言層面,虛函數是怎樣實現的?爲何還要區分虛函數和普通函數,都成虛函數很差麼?虛表裏存儲的是什麼?若是基類定義先聲明瞭f函數後聲明瞭g函數,子類定義會反過來(真正面試的時候會有樣例代碼給出),那麼虛表裏第一項是什麼?若是有多繼承,虛表內會怎樣?等等。。。這只是個大致思路,關鍵是看求職者的現場反應能力和連接能力,好比:第一題,若是提到靜態多態,而且簡單詢問後確認懂得什麼是靜態多態,則有額外加分。第二題,提到和其餘語言的對比(如java oc python 等),有額外加分。第四題,關鍵不在於答案,而在於回答的思路。若是在回答出大致原理以後加以說明這東西是undefined,不該該依賴於這個結果,有額外加分。第五題,若是一開始求職者不太瞭解這個事情,可是經過我簡單的提示,可以沿着這個思路走下去,不管對錯,均有額外加分。若是在面試中會詢問到了求職者以前沒有思考過的問題,我會給出適當的提示,逼迫其現場思考。若是中間被求職者帶跑了,好比問第一題的時候扯到模板元編程了,個人態度就是隨着他跑,在他本身最擅長的領域才能看出他的思路到底是怎樣的。總之,儘可能經過方方面面探知求職人員對技術核心思想的把握能力,若是在面試以前他就考慮的很透徹,這是上上之選(緣由是其會本身沿着正確的方向獨立思考),若是在面試中能夠現場考慮出大概,這是上之選(緣由是其邏輯思惟還不錯)。思惟方式很重要,某種程度上,這東西決定一我的的命運。

二、算法和數據結構
算法數據結構是必然要考察的重點。都說這是程序員安身立命之根本,通常面試第一關遇到的都是面試官說「咱們來寫個算法吧」,我遇到的算法基本上要麼是位運算的,要麼是DP和貪心,有一些查找和排序(包括topK)算法,不少leetcode和劍指offer上面的原題或者變種題,難度中等吧。數據結構的話比較簡單,最難的也就考過字典樹,好像你們都遵循着夠用就行的原則,反正就是隊列,樹,圖,這幾種,主要考察的是各類操做的時間複雜度,應用場景怎麼選擇等等。數據結構主要關注哈希、優先級隊列等,算法則是字符串處理、簡單的 DFS、BFS、動態規劃。

 

三、操做系統知識

進程、線程、協程、鎖的使用、消息隊列、共享內存、網絡協議、epoll、select等。順便會考察一些處理問題的基本思路,好比經過哈希來劃分、經過隊列來序列化操做等等。
其次要考察的是語言無關的基礎知識,包括操做系統概念相關知識,多線程編程,網絡編程,TCP相關網絡知識,編譯原理相關基礎知識,最後要考察的是存儲

 

四、和應聘者背景經歷有關的知識


五、開放式問題 
講講一個程序從源代碼編寫一直到程序執行整個生命週期的過程


六、實踐

用C++寫一個有理數類,class Rational,實現基本的加減乘除和輸入輸出操做。別看這麼小小的一個問題,竟然能夠考察到很是之多的地方,猶如闖關遊戲通常,直到把這個面試者推向極限。徹底不知所云的,甚至有說忘了有理數是啥的,兩個整數之比定義爲有理數,第一個叫作分子,第二個叫作分母。若是搞不清楚的怎麼作的,我會給一個main函數的示例(見下面的代碼),告訴他「面向接口編程,不要面向實現編程」。我發現有經驗的人,會問我接口或者對象的行爲是什麼樣的。能搞清楚問題,首先讓他寫出類的聲明,而後就能夠問,哪些是public,哪些是private的,什麼是運算符重載。爲什麼傳遞參數要寫 const Rational&。繼續問,構造函數,析構函數,拷貝構造函數,operator= 是怎麼回事,相關知識云云,構造函數是否是前面要加 explicit 修飾。繼續問 istream和ostream的重載怎麼寫,friend 函數是怎麼回事。讓面試者寫代碼,儘量完整地實現這個類的成員函數,中間觀察編程習慣,代碼風格等等有理數分母不能爲0,看看面試者是否是夠仔細,還有對C++的異常控制是否有了解。包括數字過大的時候,整數溢出了是否有考慮。1/3+1/3+1/3輸出應該是1,因此分子分母要約分,求最大公約數這個點想到。若是有負數,最大公約數怎麼求?istream輸入的狀況可能會不少,涉及到字符串的解析,"3.5","1/3", "-1/5", "-0.3",看看面試者能正確處理多少種狀況?順便問一下測試方面的問題。有理數的分子分母可能會很大,是否是能夠考慮模板化,寫成Rational<T>,而後能夠有個Bigint的類來實現 typedef Rational<Bigint> HighPrecisionRational;//我指望看到的解答

 

 

複製代碼
 1 #include <iostream>
 2 
 3 class Rational
 4 {
 5 public:
 6     Rational();
 7     Rational(int x);
 8     Rational(int x, int y);
 9     Rational(const Rational& r);
10     const Rational& operator=(int x);
11     const Rational& operator=(const Rational& r);
12     virtual ~Rational();
13 
14     bool operator== (const Rational& other) const;
15 
16     friend const Rational operator+ (const Rational& r1, const Rational& r2);
17     friend const Rational operator- (const Rational& r1, const Rational& r2);
18     friend const Rational operator* (const Rational& r1, const Rational& r2);
19     friend const Rational operator/ (const Rational& r1, const Rational& r2);
20     friend std::ostream& operator<< (std::ostream&, const Rational& r);
21     friend std::istream& operator >> (std::istream&, Rational& r);
22 
23 private:
24     static int gcd(int p, int q);
25     int num; //numerator
26     int div; //divisor
27 };
28 
29 
30 int main(int argc, char* argv[])
31 {
32     Rational a(1, 3);
33     Rational b = 3;
34     b = a;
35     Rational c(a + b + Rational(1, 3));
36     std::cout << "a=" << a << std::endl;
37     std::cout << "b=" << b << std::endl;
38     std::cout << "c=" << c << std::endl;
39 
40     std::cout << "Please input a Rational number like 13/15" << std::endl;
41     Rational d;
42     std::cin >> d;
43     std::cout << "value d+1=" << d + 1 << std::endl;
44     
45     return 0;
46 }
複製代碼

 

 

 

面試者能闖到最後一關的,我已經比較滿意了。整個面試的過程當中圍繞着一個功能的實現反覆交流和改進,咱們的談話已經涉及到了C++、字符串、算法、數學、代碼風格、軟件工程、測試的不少方面的知識了;同時對面試者的表達能力,溝通能力,性格方面也有所瞭解了。

 

finally. 我會給一個殺手級問題,這裏分子分母約分用到了gcd,請問時間複雜度是多少?啊哈,這裏要請出Knuth爺爺的《計算機程序設計藝術》啦!

 

我補充說明一下

1. 確實如他所說的,先給出operator+=,而後再去實現非友元的operator+,這樣是能減小代碼冗餘的;若是隻是要求實現加減乘除操做,用友元operator也沒有問題。

2. 若是隻是考慮在控制檯輸入輸出,iostream就能知足需求了; 若是更往深了討論,好比涉及到字符串解析(sstream),文件的讀寫(fstream),這個時候就須要重載參數爲basic_streamTemplate<typename charT>
basic_stream<charT>& operator<< (basic_stream<charT>& os, const Rational& r);

Template<typename charT>
basic_stream<charT>& operator>> (basic_stream<charT>& os, const Rational& r);
3. std::complex是複數,而Rational是有理數,實現細節上仍是多有不一樣的。若是是要求面試者實現一個complex的話,我曾要求他實現出複數的乘方和開方運算。

4. operator= 應該返回 const Rational&,已改正;

5. 爲什麼不直接用系統默認合成的構造析構函數。Rational x; 的值是多少呢?個人習慣是初始化爲0,並且不但願分母爲0

6. 構造函數Rational::Rational(int x),我認爲是不該該聲明爲explicit的,由於我但願重載了operator+運算符以後,r+1, 1+r都能work。咱們這裏並非要求應聘者是一名C++語法專家,更多的是但願在相互討論的過程當中,觀察面試者思考問題的深度和全面性,以及應變能力。

相關文章
相關標籤/搜索