首先介紹下自己:小碩,2015年畢業,北郵,模式識別方向,本科是學通信的,計算機初等水平吧,熟練使用C++,了解STL吧,C#/Java/Python/R也都用過,面比較廣,碼農低等水准,復雜的算法看懂就不錯了...(文章長些,不喜勿噴)
2014年剛開學,實驗時開學后沒什么任務,年假里看了些安卓的書,於是花費5天用Andengine開發了一款小游戲,純屬自娛自樂了,“暗獸器”(象獅虎豹那種)。2月20號的時候,師兄要收簡歷說幫阿里巴巴內推實習,頓時就感覺慌了,什么知識也沒有准備,劣性不該,想干什么做什么…匆忙做了份簡歷發給了師兄。24號的時候發現論壇上微軟招實習生的消息,軟件開發,簡歷也都有了就投了一份,然后生活照舊,寫寫程序,看看書,還有實驗室的小活。
26號下午,收到了微軟的電話,內容很簡單,說我們看到了你的簡歷,希望明天見面聊聊。我問地址,他說微軟研究院自己查吧,很好找...說話很可親,聊聊嘛,我說時間可以,然后就屁顛地掛了電話,繼續寫實驗室的層次聚類的一個程序。吃完晚飯,感覺明天就要面試了,第一次找實習還是很緊張的,好好准備下吧,看看C++准備點什么,於是先上網搜了下別人的面經,頓時就嚇壞了,看到了這個:
http://blog.csdn.net/uestcleo/article/details/7556364;
還看到了這個:
http://topic.yingjiesheng.com/mianshi/jingyan/2012/0420/422268.html,
等等吧,看完后精神頓時高漲了很多,心里那個委屈啊(本科我怎么沒學計算機了,學那些大學物理、電磁場、高頻什么的現在也用不到啊),總之,還沒去感覺自己就要掛了,主要是我還什么也沒准備呢,開學一直沒想這事啊。趕快指定了計划:看遍以前的C++筆記、看完數據結構(查找和圖有幾節沒學)、看點操作系統吧,忙碌了一晚上,第二天中午又繼續看了3個小時,又分析了下上面那些網頁里的微軟面試題。看着就害怕...下午1點就硬着頭皮出發了。
到微軟1點50多,在前台等了一會,來了個技術人員(一面面試官)把我帶了進去,17樓,出樓梯,說等會,我去那套題...,看來真不是只聊聊,被電話騙了吧。找了個房間,遞給我題,面試官說你做着,20分鍾我過來,說着他看看表:誒,正好2點整。我也看了下表,咦,這不明明是2:02嘛。。。看看卷子20分鍾15道題,只有一個想法了:掛了。
說一下題目吧,整個試卷是以C#為主吧,可能每個部門不一樣,但能感覺出來C#都很基礎,不難,只要真正學過C#的(不要像我只在C#中寫過點處理程序),了解下C#的底層,至少4道題應該沒問題。話說回來,可惜我沒真正學過,C#的還有ASP.NET的我就直接放棄了,只回答了下C++中知道的,當然最后C#的也蒙了點。
1.抽象類和接口的區別?
1、抽象類是類,它的子類不能再繼承其它類了,但可以實現一個和多個接口。接口不是類,它的子接口可以繼承多個接口。
2、抽象類中是可以有不用abstract修飾的方法,而接口中只能有抽象方法,即方法都要用abstract修飾。
3、抽象類可以實現接口,而接口是不能繼承或實現抽象類的。
2.進程和線程的區別和關系?
進程是資源分配的基本單位,線程基本上不擁有資源;線程是程序執行的基本單位,進程創建時一般只有一個線程,需要時可由這個線程創建其他線程;一個進程可以有多個線程,它們共享進程資源,在進程的空間中並發活動。
3.UDP和TCP協議的區別?
TCP是面向連接的,可靠傳輸,適於傳輸大量數據;UDP是面向非連接的不可靠傳輸,適於小量數據的傳輸。
4.異步的概念和實現方式?
當一個異步過程調用發出后,調用者不能立刻得到結果。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者。
執行部件和調用者通過三種途徑返回結果:狀態、通知和回調。可以使用哪一種依賴於執行部件的實現,除非執行部件提供多種選擇,否則不受調用者控制。如果執行部件用狀態來通知,那么調用者就需要每隔一定時間檢查一次,效率就很低(有些初學多線程編程的人,總喜歡用一個循環去檢查某個變量的值,這其實是一種很嚴重的錯誤)。如果是使用通知的方式,效率則很高,因為執行部件幾乎不需要做額外的操作。至於回調函數,其實和通知沒太多區別。
5. .NET的內存回收機制?
每次當開發人員使用 new 運算符創建對象時,運行庫都從托管堆為該對象分配內存。新創建的對象被放在上次創建的對象之后。垃圾回收器保存了一個指針,該指針總是指向托管堆中最后一個對象之后的內存空間。
當垃圾回收器的指針指向托管堆以外的內存空間時,就需要回收內存中的垃圾了。在這個過程中,垃圾回收器首先假設在托管堆中所有的對象都需要被回收。然后它在托管堆中尋找被根對象引用的對象(根對象就是全局,靜態或處於活動中的局部變量以及寄存器指向的對象),找到后將它們加入一個有效對象的列表中,並在已經搜索過的對象中尋找是否有對象被新加入的有效對象引用。直到垃圾回收器檢查完所有的對象后,就有一份根對象和根對象直接或間接引用了的對象的列表,而其它沒有在表中的對象就被從內存中回收。
6.堆和棧的區別?
棧區由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。堆區一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。
C#中值類型存放在堆棧中,引用類型存放在托管堆上。
7.泛型的概念和泛型類型
這里問的應該是C#的,我不太了解,回答的C++的泛型編程:通過模板實現同一算法,並使其適用於不同的數據類型。(容器)類型有:string、vector、list、queue等。
8.考慮有個數據庫表manager(employee_name,manger_name)表示職員被那個經理管理,現在要找到直接或間接被某個經理管理的雇員?
這是《數據庫系統概念》書中第四章的遞歸查詢,可惜星號部分,看的時候一掃而過,只寫了四個字:遞歸查詢。其實程序應該是:
with recursive empl(employee_name,manager_name) as ( select employee_name,manager_name from manager where manager_name = 'XXX' union select manager.employee_name,empl.manager_name from maneger,empl where manager.manager_name =empl. employee_name ) select * from empl;
9.按指定位置交換字符串兩部分的位置比如:函數輸入("abcde", 2) 輸出"cdeab"
int SwapStr(char* input, int pos) { char* p = input+pos; int nLen = strlen(input); //對輸入數據檢查 if (input==NULL || nLen<pos) {return -1;} char* temp= new char[pos+1]; if (temp == NULL) return -1; memcpy(temp, input, pos); temp[pos]='\0'; memcpy(input, p, nLen-pos); memcpy(input+nLen-pos, temp, pos); delete[] temp; temp = NULL; return 0; }
10.給定鏈表的頭指針和一個結點指針,在O(1)時間內刪除該結點,鏈表結點的定義如下:
struct ListNode { int m_nKey; ListNode* m_pNext; };
函數的聲明如下:void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted);
void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted) { if (NULL != pToBeDeleted->m_pNext) { ListNode *pRealDeleted = pToBeDeleted->m_pNext; pToBeDeleted->m_nKey = pRealDeleted->m_nKey; pToBeDeleted->m_pNext = pRealDeleted->m_pNext; delete pRealDeleted; } else { ListNode *pNode = pListHead; while (NULL != pNode) { if (pNode->m_pNext == pToBeDeleted) { pNode->m_pNext = NULL; delete pToBeDeleted; break; } pNode = pNode->m_pNext; } } }
大致就記得這些題目了,感覺還是都比較基礎,就是時間不夠...,當時的感覺就是要掛了,趕快放我走吧。二十分鍾后,開始面試,面試官很嚴肅,有些題只是簡單寫了幾個字,本以為面試時會問試卷的題目,結果提都沒提考卷的題目,看見了一堆錯號...改完試卷繼續面試,說下面試題目。
什么是時間復雜度和空間復雜度?答:時間復雜度就是隨着問題規模n的增大,算法運行時間的增長率;空間復雜度就是算法的空間需求。
是不是數據越多,空間復雜度越大?答:不是,針對某個問題,算法的空間復雜度只和實現中所需的輔助變量有關。不知道答得對不對,總之,面試官是面無表情,繼續追問。
怎么降低時間復雜度?答:針對某個問題,采用不同的算法就會有不同的時間運行效率,比如快排在大多場合就優於簡單排序。
繼續被問:同一個算法呢?答:減少循環的使用,減少循環的嵌套,將多維數組盡可能拆分為1維數組。
面試官笑笑:咱們假設這個程序不是比較2的程序員寫的,是專家寫的?答:不知道,沒有遇到過(我也不是專家啊)。
然后面試官說好,咱們談談你做的項目吧,我說給你簡歷,他說不用了,你就說說吧。心里頓時感覺我快走了,面試官很不屑啊。我說了做的項目,問了我搜索引擎的一個問題,答得還可以吧,然后就面試結束了,讓我等下一個面試官。心里想微軟面試官真的不錯,即使我自己都鄙視自己了,他還要走個流程,讓我面完再Pass掉。
稍等片刻,我把簡歷趕快從包里拿出來了,想待會可能有用。第二個面試官來了,我說這是我的簡歷,他說不用...這次他帶了筆記本,然后問我項目,我說了我研究生一直跟着老師做的863項目,但他並沒有太大興趣,只是說,這個很多人都再做。然后問,其他的呢?我又說了幾個自己接的私活,他問的特別多,非常有興趣,他直接就說:這是你自己接的私活吧,實驗室接的任務沒有這么明確的商業目的的。然后詢問了我做着兩個私活過程中的解決方法,基本是我回顧了一下當時做程序時所遇到的各種問題,采取的各個方案。后面的聊天非常開心,他說分析能力不錯,但看你的答題,編程很不理想啊...介紹了他們的工作,希望我能去,還留了他的聯系方式。180度大轉彎,回來給他發了封郵件,問下一步安排,說HR will contact you later。
28號收到了HR的電話,基本就是咨詢下我的情況,安排Onbroad時間,Mentor去美國了等他回來,三月中旬后就可以去實習了。不懂的知識太多了,想起三字經:“幼不學,老何為!”。
這是我研究生第一次實習面試,還是比較“青澀”吧,大致總結下這次面試的經驗吧:
1.微軟的面試官都比較簡單,凡事從簡,直截了當,很少給人一種親和感,交談有時壓抑了些(也可能是我跟不上他們吧)。
2.微軟的面試題比較簡單,仔細想想網上其他的面試題也是很簡單的,無非是思路巧妙一些,看看程序員面試寶典、編程之美什么的基本都有(我要開始看了),但是面還是比較廣的。
3.普適面試場合上,要跟着面試官的思路走,自己認為重要的可能不是他感興趣的;面試官感興趣的就是他看重的,就要多介紹、多說。