今天在上海交大閔行校區,筆試了vmware。寫一篇日志,記錄下筆試的題目。
試題形式:90分鍾。20道不定項選擇題,占60%分數;2個寫程序的題目,占40%分數。全英文。
ps: 晚上在北郵人論壇上和同學們討論了下,試題一共至少有四套,上海北京各兩套。我做的是 version 1, Shanghai. 北京的版本,時間是150分鍾。30個不定項選擇,有三道或四道寫程序題目的兩種。難度,因為沒做過,不好衡量,不過上海的題目少並不就比北京的版本簡單。
從后往前寫吧,因為后邊的題目記得清楚些。題目后邊的 ref 是我搜索到一些相關技術文章,供我寫完這篇隨筆后慢慢學習使用。
一. 寫程序題目:
1. 給定一個 int 類型的數,在一個已經排序好的數列 int[] 中查找該數出現了多少次。例如 [1 1 2 2 2 4 6 7 7 8 9 10], f(7) = 2。設計一個你認為最理想的算法。描述算法,並給出時間復雜度。
我是用 java 寫的,算法是構建一個 Hashtable<Integer, Integer>, key 和 value 分別是數字和該數字出現的次數。然后在這個Hashtable 中查找給定數字出現的次數。構建 Hashtable 的時間復雜度是 O(n),n 是數列長度,查找給定數字的時間復雜度是 O(1)。
ps: 據同學告訴我,題目要求是不能用 java.util.* ,所以我可能做錯了%>_<%
2. (第二個題目描述很復雜,而且我做到這道題的時候,已經不到10分鍾了,我按照我記得的復述一下,不一定正確)分配存儲空間,有一種 aligned_malloc 方法,它每次動態分配的存儲空間是2的次方,比如 16, 32, 64...,根據實際需要的 size 來確定分配的 aligned memory。實現下面兩個函數:
1) void * aligned_malloc(int size, int alignment)
2) void * aligned_free(void * memory)
ref: http://msdn.microsoft.com/zh-cn/library/vstudio/8z34s9c6.aspx
這道題目是 Cracking the coding interview 上的第 16.9 題(或其變種?)
Write an aligned malloc & free function that takes number of bytes and aligned byte(which is always power of 2)
e.g. align_malloc(1000, 128) will return a memory address that is a multiple of 128 and that points to memory of size 1000 bytes.
aligned_free() will free memory allocated by align_malloc.
SOLUTION
1. We will use malloc routine provided by C to implement the functionality.
Allocate memory of size(bytes required + alignment - 1 + sizeof(void *)) using malloc.
alignment: malloc can give us any address and we need to find a multiple of alignment.
(Therefore, at maximum multiple of alignment, we will be alignment -1 bytes away from any location.)
sizeof(size_t): we are returning a modified memory pointer to user, which is different from the one
that would be returned by malloc. We also need to extra space to store
the address given by malloc, so that we can free memory in aligned_free by calling free routine provided by C.
2. if it returns NULL, then aligned_malloc will fail and we return NULL.
3. Else, find the aligned memory address which is a multiple of alignment (call this p2).
4. Store the address returned by malloc (e.g., p1 is just size_t bytes ahead of p2), which
will be required by aligned_free.
5. Return p2.
1 void* aligned_malloc(size_t required_bytes, size_t alignment) { 2 void* p1; // original block 3 void** p2; // aligned block 4 5 int offset = alignment - 1 + sizeof(void*); 6 if ((p1 = (void*)malloc(required_bytes + offset)) == NULL) { 7 return NULL; 8 } 9 p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1)); 10 p2[-1] = p1; 11 return p2; 12 } 13 14 void aligned_free(void *p) { 15 free(((void**)p)[-1]); 16 }
二. 選擇題目
每一道題目都需要一定的時間,所以這部分我記得的比較亂,而且我記住的許多是我不會或者拿不准的題目,畢竟比較困難的題目在腦海中會盤桓的比較久一點。我隨便寫下我記得的吧,下面的標號不是實際的題號。
1. 這是第一題,給定一個數組和數組的排序過程,然后問是那種排序,我選的是堆排序。不過選項中有個 shell sort,我忘了是它是怎么實現的了...
2. GET 和 POST 的區別,當然,題目本身不是這么問的,每個選項都很細節,我不確定。記得有 GET是不是比 post 更安全, post是不是能傳輸更多的信息, post 的傳輸數據量是不是無限的。
ref: http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
http://zhidao.baidu.com/question/7984230.html
http://youngsin2009.cnblogs.com/
3. Etag 標簽和 http 協議中什么選擇相關聯,我選擇了 if-modified-since,回來之后,百度了下,還應該選 if-matched/if-none-match
ref: http://en.wikipedia.org/wiki/HTTP_ETag
http://baike.baidu.com/view/3039264.htm
4. 數據庫有兩個選擇題,一個是 pattern expression 的,選取某 column 中以字符串 abcd 開頭的項,答案是 A,表達式部分是 LIKE 'abcd%' ; 另一道數據庫的題目是 database index 是用哪些數據結構實現的,選項有 b tree, b+ tree, b- tree, AVL tree 還有一個忘了,我只選了 b+ b-樹,應該是漏選了。
ref: http://en.wikipedia.org/wiki/Database_index
http://www.linezing.com/blog/?p=798#nav-1
5. 有兩道虛函數表的題目,Vmware 好像很看重這個,因為我看到在2010年和2011年的筆試面試中都有這方面的題目,當然,它不是直接問你概念,而是很具體的例子和細節,所以盡管我之前看了好幾篇虛函數表的文章,依然不是很確定做沒做對。
ref: http://blog.csdn.net/haoel/article/details/1948051/
6. 完全二叉樹,有 N 個node, 問葉子節點有多少個。
我通過舉列子試驗,得出答案是:N/2 和 (N+1)/2
7. 死鎖問題。有3個 processes,每個process 都需要4個同一類型的 resources。問如果不發生死鎖,那么至少 (at least) 需要多少個 resources?
選項有9、10、11、12 四個。 我選擇的10。
8. toplogical sort 問題。一個單項無環圖 (a directed acyclic graph),有這些邊 (<1, 2> <2, 3> <3, 4> <1, 4>),問這幅圖的 toplogical sort 是什么?
拓撲排序方法如下:
(2)從網中刪去該頂點,並且刪去從該頂點發出的全部有向邊.
(3)重復上述兩步,直到剩余的網中不再存在沒有前趨的頂點為止
9. Brain teaser 題目有兩三個吧。記得一個排隊買電影票的問題。題目是有10個人排隊買電影票,電影票每張 5$,其中5個有 5$ 的紙幣,另外5個人只有 10$ 的紙幣,問有多少種排隊方法,讓售票員順利賣給他們票,同時不需要准備零錢?
選項有41, 42, 43... 這道題我想了會兒沒想出來,就隨便選了一項,繼續往下做了。
ps: 在論壇上求教后,答案是:42。
卡塔蘭數。
對於任意一個位置滿足 f(n5)>f(n10)就是合法排列~這個在編程之美上有這個題
另一個題目是:有5只小白鼠,實驗瓶子里裝的是不是毒葯,小白鼠服用一個瓶子里的葯水,如果5分鍾后小白鼠死亡,則證明該瓶子中裝的是毒葯。問最多可以測試多少瓶葯水。我選擇的是 32。
選項的數字都不小,我猜測的,2的5次方是32...
10. 一個 process 中的 threads 之間共享的有什么。很多個選項。我選擇了 shared memory, states, virtual address space, Signals, File Descriptor.
ref: http://www.samba.org/~tridge/talks/threads.pdf
11. Demand Paging, 一類操作系統的 memory management 中的 Page replacement algorithm。給定了一串 page 數組,系統只能保存三個 page,兩種算法 a). fist-in-first out b). last modified 問各需要多少次 page replacement 操作。
ref: http://en.wikipedia.org/wiki/Demand_paging
ref: http://en.wikipedia.org/wiki/Page_replacement_algorithms
12. 什么影響操作系統的 virtual address space? 選項有 physical memory size, CPU cache size, bus size 等等。看了下下邊的wiki,答案應該是和總線的大小有關系,
"a 32-bit OS, the process has a 4 GiB VAS: each one of the memory addresses (from 0 to 232−1)"
"By default, 64-bit processes have 8TB of user-mode virtual address space"
ref: http://en.wikipedia.org/wiki/Virtual_address_space
。
寫到這里發現大部分的題目都已經被我寫出來,看來我的記憶力還可以 :-0) 但願我能通過筆試
--------------------------------------以下內容和本文題目無關--------------------------------------
ps:
寫完這篇文章,發現自己......尤其是論壇上同學指出第一個寫程序的題我可能不符合題目要求。。。內心更加忐忑了。。。依然 0 offer,心情比較 blue,也許我做不成程序員了吧~ 本科在北郵學習的計算機和通信(貌似大部分北郵的專業都是這些課),研究生,先是和本科來自MIT, Cam 的同學們一起學 AI, 發現是“數學”;接着又師從諾貝爾獎得主學習光纖,發現是“物理” o(╯□╰)o 找工作了,發現還是寫程序的工作需求大,自己也想嘗試做程序員,奈何一方面自己水平菜另一方面今年行業整體形勢不好,找工作屢屢受挫。。。找工作疲了,發發牢騷,生活還要 move on~
論壇上,很多人都還沒有offer,有人發帖念叨念叨,一個mm的回復說的很好:
【 在 bupt2010karl 的大作中提到: 】
同lz,目前是0 offer,煩躁,想去的去不了不想去的還得逼自己去筆試還有論文。這個冬天格外寒,多少次想放棄卻吐吐槽還要繼續,多少次想算了只要有公司要就簽了但還是放不下心中那個小小夢,懷疑,猶豫,彷徨,放棄,堅持,好多時候覺得放棄要好多理由堅持卻只需一個理由:為青春少點遺憾,不管結果會怎樣至少曾經也那樣執着地追求過。一個人的北漂真心不容易。。。。。。大家都加油吧