程式員面試:電話面試問答Top 42(下)

來源:互聯網
上載者:User
今年是2015年,在過去幾年中,電面(電話面試)是篩選程式員職位候選人的最流行的方式。它讓僱傭雙方很容易互相瞭解對方,候選人不需要去未來僱主的所在地,面試官也不用做額外的安排。這是我介紹程式員面試問題的文章的第二部分。我得到反饋說第一部分過於偏重編碼的題了,許多程式員希望我針對電面問題列一個類似的列表。為了順利通過電面進入下一輪,你必須足夠好地回答與你工作要求相關的全部問題。在大多針對Java和C++開發人員的電面中,你不僅會遇到相應程式語言的問題,還會遇到其他技術的問題,比如SQL、XML、UNIX、泛型程式設計、物件導向編程、資料結構與演算法、網路、編碼以及工作的其他方面。由於程式員求職電面的多變性,你需要有特殊的技巧,以面試官期待的方式展示自己。

要記住一件重要的事,在回答電面問題的時候,儘早提出關鍵點,總是給出關鍵性回答。由於面試官的問題往往會覆蓋很大範圍的主題,他們更喜歡關鍵性回答,而不是“OK,我知道”之類的空話。在面對面的面試中,你會有機會更深入地解釋問題的。順便說一下,這並不是固定的規則,根據面試官對你的回答的反應,你可以瞭解到他期望得到什麼樣的回答。如果他進行追問,期望你多說一些,那麼你就應該多說。但如果他立刻跳到下一個問題,那麼你就應該回答得清晰簡潔。在這篇文章中,我要和你分享一些常見的有趣編程問題,它們是針對電面改編過的。其中大部分都來自科技公司的電面環節,包括Barclays、Citi、Nomura之類的銀行,和Infosys、TCS、CTS、Tech Mahindra和HCL之類的提供服務的公司。像我之前提過的,面試題是隨機選的,但大部分是基於基礎知識,因為那是面試官在電面時想考察的。儘管這些問題大多數是針對初級開發人員(2至5年經驗),進階和資深程式員仍然可以把它們用作自己面試的題目。如果你是一名面試官,你可以用這些問題快速篩選開發職位的候選人。我在此提供簡短答案,並給出詳細答案的連結。

下面是幾乎42道程式員電面題目的列表。這些問題可以用來考察任何程式員、開發人員、軟體工程師、測試和運營工程師,因為它們是基於程式設計的基礎知識的。但它們最適合程式員和開發人員。順便說一下,如果你是Java開發人員,並且在尋找Java電面題目,去看看那個列表。本列表更加普遍,適用於所有的程式員,包括Python、Ruby、Perl和C#開發人員。

22. 你能否描述三種不同的在應用程式發布前對其進行測試的方式?

單元測試,整合測試,煙霧測試 (Smoke Test)。單元測試用來測試獨立的單元是否依照預期工作,整合測試用來測試已被測試過的獨立單元能否共同工作,煙霧測試 (Smoke Test)用來測試軟體最常用的功能是否正常工作,例如在一個飛機訂票網站中,你應該能訂票,取消或更改航班。

23. 迭代和遞迴有什麼區別?(detailed answer)

迭代通過迴圈來重複執行同一步驟,遞迴通過調用函數自身來做重複性工作。遞迴經常是複雜問題(例如漢諾塔、反轉鏈表或反轉字串)的清晰簡潔的解決方案。遞迴的一個缺陷是深度,由於遞迴在棧中儲存中間結果,你只能進行一定深度的遞迴,在那之後你的程式會因為StackOverFlowError而崩潰。這就是在產品代碼中優先使用迭代而不是遞迴的原因。

24. &和&&運算子的區別是什嗎?(detailed answer)

&是位元運算符,&&是邏輯運算子。&和&&的一個區別是位元運算符(&)可以被用於整型和布爾類型,邏輯運算子(&&)只能被用於布爾類型變數。當你寫a & b時,兩個整型數的每一位都會進行與運算。當你寫a && b時,第二個參數可能會也可能不會被執行,這也是它被稱為短路運算子的原因,至少在Java中是這樣的。我很喜歡這個問題,經常對初級開發人員和畢業生問這個問題。

25. 1 XOR 1的結果是什嗎?

答案是0,因為XOR在兩個運算元(按位)不同時返回1,相同時返回0。例如0 XOR 0仍然是零,但0 XOR 1和1 XOR 0的結果是1。

26. 如何得到一個整型數的最後一位? (answer)

用模數運算子,數字 % 10返回數位最後一位。例如2345 % 10會返回5,567 % 10會返回7。類似的,除運算子可以用來去掉數位最後一位,例如2345 / 10的結果是234,567 / 10的結果是56。這是值得瞭解的一個重要技巧,可以用來解決類似迴文數、反轉數的問題。

27. 什麼是測試驅動開發?

測試驅動是一種常見的開發方法,在這種方法中,測試代碼在功能代碼之前編寫。測試決定了程式的結構。測試驅動的純粹主義者在寫為應用寫測試之前,不會寫一行的應用代碼。這能很大幅度地提高代碼品質,經常被認為是巨星級開發人員的品質。

28. 裡氏替換原則(Liskov substitution principle, LSP)是什嗎?(answer)

裡氏替換原則是鮑勃大叔稱作SOLID的五條設計原則中的一條。裡氏替換原則規定,所有的子類都能作為父類的代理(proxy)工作。例如,如果一個方法需要父類對象作為輸入,那麼如果你提供一個子類對象,它也應該正常工作。任何不能替代父類的類都違反了裡氏替換原則。這實際上是一個難以答出的問題,如果你答出了,那麼就會給面試官留下好的印象。

29. 什麼是開閉(Open closed)設計原則?(answer)

開閉原則是SOLID中另一個重要的原則,它規定一個系統對擴充是開放的,但對修改是封閉的。意思是說,如果一個新的功能要被加入一個穩定的系統,那麼你不需要碰已被測試過的現有代碼,新的功能可以通過只添加新類來實現。

30. 二叉樹和二叉尋找樹的區別是什嗎?

二叉尋找樹是有序的二叉樹,所有節點(例如根節點)的左子樹節點的值都小於或等於該節點的值,右子樹節點的值都大於或等於該節點的值。它是一個重要的資料結構,可以用來表示有序的資料。

31. 你能否給出一個遞迴演算法的實際例子?(example)

遞迴演算法能適用在很多地方,例如與二叉樹和鏈表相關的演算法。幾個與遞迴演算法的例子包括反轉字串,計算斐波那契數列。其他的例子包括反轉鏈表、樹遍曆以及快速排序。

31. 演算法的時間複雜度是什嗎?

時間複雜度表示的是已耗用時間對輸入量的比率。他表示一個演算法處理一定量的輸入需要多長時間。它是一個估計值,但足夠表示輸入量從十增長到一千萬時,你的演算法會有什麼樣的表現。

33. 鏈表和數組有哪些重要區別?(detailed answer)

鏈表和數組都是程式設計世界中重要的資料結構。它們間最明顯的區別是,數組將元素存放在連續的地址中,鏈表將資料存放在記憶體中任意的位置。這使得鏈表有巨大的擴充自己的靈活性,因為記憶體總是分散的。這種情況總是可能的:你無法建立一個數組來存放一百萬個整數,但可以用鏈表來存放,因為空白間是存在的,只是不連續。其他的不同都是源於這項事實。例如,在數組中,如果你知道下標,可以用O(1)的時間得到一個元素,但在鏈表中要花O(n)的時間。更多不同參見詳細答案。

33. 在雜湊表中處理衝突的方法都有哪些?

線性探測(linear probing),二次雜湊(double hashing)和連結(chaining)。線上性探測中,如果桶已經被佔據了,那麼函數會線性地檢查下一個桶,直到找到一個空位。在連結中,多個元素可以儲存在同一個桶中。

34. Regex是什麼意思? (answer)

Regex是在文本型資料上進行模式比對的方法。它是一種搜尋的強有力方法,例如搜尋長字串中的某些字元,例如搜尋一本書中是否含有某個單詞。所有主流程式設計語言都支援Regex,但是PerlRegex的能力是著名的。Java的java.util.regex包也支援類似Perl的Regex。你可以用Regex檢查email地址是否有效,電話號碼是否有效,郵遞區號是否有效,甚至社會保險號(SSN)是否有效。Regex最簡答的例子之一是檢查字串是不是一個數。

35. 什麼是無狀態(stateless)系統?

無狀態系統是不維護內部狀態的系統。這種系統在任何時刻,對相同的輸入都會給出相同的輸出。編寫最佳化一個無狀態系統總是比較簡單的,所以如果可能,你總是應該優先編寫無狀態系統。

36. 寫一個SQL查詢,在僱員表中尋找第二高的工資。 (solution)

這是SQL面試的經典題目之一,儘管已經很老了,還是很有趣,並且可以追問很多問題來測試候選人的知識深度。你可以用相關或不相關的子查詢來尋找第二高工資。如果你在用SQL Server或MySQL,你也可以用類似TOP和LIMIT之類的關鍵字,前提是面試官允許。尋找第二高工資的最簡答方法是:

這個查詢首先尋找最高工資,然後將它從列表中排除,再尋找最高工資。很明顯,第二次返回的是第二高工資。

37. 可否描述一下什麼是關聯的和不關聯的子查詢?(answer)

在關聯的子查詢中,內層查詢依賴於外層查詢,對外層查詢的每一行執行。非關聯的子查詢不依賴於外層查詢,可以獨立執行。因此,前者慢,後者快。順便說一下,關聯的子查詢有一些很棒的應用,其中包括在僱員表中尋找第N高的工資,這在上一道SQL問題中也有提到。

39. 不用算術運算子,如何判定一個數是否是二的冪?(solution)

當你聽到不能用算術運算子的限制時,應該立刻假定這是一道關於位元運算的題。如果沒有這條限制,那麼你可以輕鬆地用模數和除運算子檢查一個數是不是二的冪。用位元運算符,有一個很巧妙的方法來完成任務。你可以用下面這段代碼來檢查一個數是不是二的冪

1

2

3

public static boolean powerOfTwo(int x) {

return (x & (x - 1)) == 0;

}

x & (x-1)是一個很棒的技巧,可以將最右邊的為1的位設為0。我是從《高效程式的奧秘》這本書中學到的。

40. 如何在UNIX上找到一個正在啟動並執行Java進程?(command)

你可以組合使用ps和grep命令來尋找UNIX機器上的任何進程。假設你的Java進程有名字,或者有任何可以用來匹配的文字,那麼使用這個命令。

ps -ef | grep “myJavaApp”

ps -e將列出所有的進程(所有使用者的進程,不只是你的),ps -f將顯示所有細節,包括PID。如果你想要深入調查或用kill命令殺死這個進程,你會需要PID。

41. 如何在UNIX中尋找大的檔案,例如1GB以上的檔案? (command)

你可以輕鬆地用find命令尋找大的檔案,因為它提供依據大小尋找檔案的選項。如果你的檔案系統滿了,你的Java進程因為沒有空間而崩潰,那麼就使用這個命令。這個命令可以列出所有大於1GB的檔案。你可以很容易地改變大小,例如尋找所有100MB以上的檔案,就用+100M。

find . – type f -size +1G -print

42. shell指令碼是什嗎?

shell指令碼是包含程式元素(例如if和for迴圈)的一組shell命令,它可以自動做一些重複的任務。例如,你可以寫一個shell指令碼來每天清理記錄檔,為記錄曆史備份資料,以及其他家務活、版本發布、監視等等。

免費領取LAMP兄弟連原創PHP教程光碟片/《細說PHP》精要版,詳情諮詢官網客服:http://www.lampbrother.net

PHPCMS二次開發http://yun.itxdl.cn/online/phpcms/index.php?u=5

開發http://yun.itxdl.cn/online/weixin/index.php?u=5

移動互連網伺服器端開發http://yun.itxdl.cn/online/server/index.php?u=5

Javascript課程http://yun.itxdl.cn/online/js/index.php?u=5

CTO訓練營http://yun.itxdl.cn/online/cto/index.php?u=5

以上就介紹了程式員面試:電話面試問答Top 42(下),包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.