今年是2015年,在過去幾年中,電面(電話面試)是篩選程式設計師職位候選人的最流行的方式。它讓僱用雙方很容易互相了解對方,候選人不需要去未來雇主的所在地,面試官也不用做額外的安排。這是我介紹程式設計師面試問題的文章的第二部分。我得到回饋說第一部分過於偏重編碼的題了,許多程式設計師希望我針對電面問題列一個類似的清單。為了順利通過電面進入下一輪,你必須足夠好地回答與你工作要求相關的全部問題。在大多針對Java和C++開發者的電面中,你不僅會遇到對應程式語言的問題,還會遇到其他技術的問題,例如SQL、、 XML、UNIX、泛型程式設計、物件導向程式設計、資料結構與演算法、網路、編碼以及其他工作的面向。由於程式設計師求職電面的多變性,你需要有特殊的技巧,以面試官期待的方式展現自己。
要記住一件重要的事,在回答電面問題的時候,儘早提出關鍵點,總是給出關鍵性回答。由於面試官的問題往往會涵蓋很大範圍的主題,他們更喜歡關鍵性回答,而不是「OK,我知道」之類的空話。在面對面的面試中,你會有機會更深入地解釋問題的。順便說一下,這並不是固定的規則,根據面試官對你的回答的反應,你可以了解到他期望得到什麼樣的答案。如果他進行追問,期望你多說一些,那你就應該多說。但如果他立刻跳到下一個問題,那麼你就應該回答得清晰簡潔。在這篇文章中,我要和你分享一些常見的有趣程式設計問題,它們是針對電面改編過的。大部分來自科技公司的電面環節,包括Barclays、Citi、Nomura CTS、Tech Mahindra和HCL之類的提供服務的公司。像我之前提過的,面試題目是隨機選的,但大部分是基於基礎知識,因為那是面試官在電面時想考察的。雖然這些問題大多是針對初級開發者(2至5年經驗),高級和資深程式設計師仍然可以把它們用作自己面試的題目。如果你是面試官,你可以用這些問題快速篩選開發職位的候選人。我在此提供簡短答案,並給出詳細答案的連結。
下面是幾乎
42道程式設計師電面題目的清單。這些問題可以用來檢視任何程式設計師、開發者、軟體工程師、測試和營運工程師,因為它們是基於程式設計的基礎知識的。但它們最適合程式設計師和開發者。順便說一下,如果你是Java開發者,並且在尋找Java電面題目,去看看那個清單。本列表更加普遍,適用於所有的程序員,包括Python、Ruby、Perl和C#開發者。
22.
你能否描述三種不同的在應用程式發布前對其進行測試的方式?
單元測試,整合測試,冒煙測試。單元測試用來測試獨立的單元是否按照預期工作,集成測試用來測試已被測試過的獨立單元能否共同工作,冒煙測試用來測試軟體最常用的功能是否正常工作,例如在一個飛機訂票網站中,你應該能訂票,取消或更改航班。
23.
迭代和遞歸有何不同? (detailed answer)
迭代透過循環來重複執行相同步驟,遞歸透過呼叫函數本身來做重複性工作。遞歸經常是複雜問題(例如漢諾塔、反轉鍊錶或反轉字串)的清晰簡潔的解決方案。遞歸的一個缺陷是深度,由於遞歸在堆疊中儲存中間結果,你只能進行一定深度的遞歸,在那之後你的程式會因為StackOverFlowError而崩潰。這就是在產品程式碼中優先使用迭代而不是遞歸的原因。
24. &
和&&運算符的區別是什麼? (detailed answer) &是位元運算符,&&是邏輯運算符。 &和&&的一個區別是位運算符(&)可以用於整型和布林類型,邏輯運算符(布林類型變數。當你寫a & b時,兩個整數數的每一位都會進行與運算。當你寫a && b時,第二個參數可能會也可能不會被執行,這也是它被稱為短路運算符的原因,至少在Java中是這樣的。我很喜歡這個問題,經常對初級開發者和畢業生問這個問題。 25. 1 XOR 1 答案是 ,因為XOR在兩個操作數(位元)不同時回傳1在兩個運算元(位元)不同時回傳1,相同時返回。例如0 XOR 0仍然是零,但0 XOR 1和1 XOR 0的結果是11。 26. (answer)用取模運算符,數字 回傳數字的最後一位。例如2345 % 10會回傳5,567 % 10會回傳7。類似的,除運算子可以用來去除數字的最後一位,例如2345 / 10的結果是234,567 / 100這是值得了解的重要技巧,可以用來解決類似回文數、反轉數的問題。 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. 正規表示式是什麼意思? (answer) 正規表示式是在文字型資料上進行模式比對的方法。它是一種搜尋的強大方法,例如搜尋長字串中的某些字符,例如搜尋一本書中是否含有某個單字。所有主流程式設計語言都支援正規表示式,但是Perl正規表示式的能力是著名的。 Java的java.util.regex套件也支援類似Perl的正規表示式。你可以用正規表示式檢查email地址是否有效,電話號碼是否有效,郵遞區號是否有效,甚至社會保險號碼(SSN)是否有效。正規表示式最簡答的例子之一是檢查字串是不是一個數。
35. 什麼是無狀態(stateless)系統? 無狀態系統是不維護內部狀態的系統。這種系統在任何時刻,對相同的輸入都會給予相同的輸出。寫最佳化一個無狀態系統總是比較簡單的,所以如果可能,你總是應該優先寫無狀態系統。
36. 寫一個SQL查詢,在員工表中找出第二高的薪水。 (solution) 這是SQL面試的經典題目之一,儘管已經很老了,還是很有趣,並且可以追問很多問題來測試候選人的知識深度。你可以用相關或不相關的子查詢來找出第二高工資。如果你在用SQL Server或MySQL,你也可以用類似TOP和LIMIT之類官的關鍵字,前提是面試。尋找第二高工資的最簡答方法是: 這個查詢首先查找最高工資,然後將它從列表中排除,再查找最高工資。很明顯,第二次返回的是第二高工資。
37. 可否描述一下什麼是關聯的和不關聯的子查詢? (answer) 在關聯的子查詢中,內層查詢依賴外層查詢,對外層查詢的每一行執行。非關聯的子查詢不依賴外層查詢,可以獨立執行。因此,前者慢,後者快。順便說一下,關聯的子查詢有一些很棒的應用,其中包括在僱員表中查找第N高的工資,這在上一道SQL問題中也有提到。
39. 不用算術運算符,如何判定一個數字是否為二的冪? (solution) 當你聽到不能用算術運算符的限制時,應該立刻假定這是一道關於位運算的題。如果沒有這條限制,那麼你可以輕鬆地用取模和除運算子檢查一個數是不是二的冪。用位元運算符,有一個很巧妙的方法來完成任務。你可以用下面這段程式碼來檢查一個數字是不是二的方 1 2 3 (Fpublicmpublicstatobstatic x & (x - 1)) == 0; } x & (x-1) 11設為0。我是從《高效程式的奧秘》這本書中學到的。 40. 如何在UNIX上找到一個正在運行的Java進程? (command) 你可以組合使用ps和grep命令來查找UNIX機器上的任何進程。假設你的Java進程有名字,或有任何可以用來配對的文字,那就使用這個指令。 ps -ef | grep “myJavaApp” ps -e將列出所有的進程(所有用戶的進程,不只是你的),ps -f ,包括PID。如果你想要深入調查或用kill命令殺死這個進程,你會需要PID。 41. UNIX中尋找大的文件,例如1GB中尋找大的文件,例如1GB1GB以上的文件? 你可以輕鬆地用find命令尋找大的文件,因為它提供依據大小尋找文件的選項。如果你的檔案系統滿了,你的Java進程因為沒有空間而崩潰,那就使用這個指令。這個指令可以列出所有大於1GB的檔案。你可以很容易地改變大小,例如尋找所有100MB以上的文件,就用+100M find . – type f -size +1G -print
42. shell shell腳本是包含程式元素(例如if和for循環)的一組shellfor循環)的一組例如,你可以寫一個shell 腳本來每天清理日誌文件,為記錄歷史備份數據,以及其他家務活、版本發布、監視等等。 免費領取LAMP兄弟連原創🜎盤《細說PHP 》精要版,詳情諮詢官網客服:http://www.lampbrother.netPHPCMS .二次開發 /index.php?u=5 http://yun.itxdl.cn/online/weixin/index.php?u=5開發 http://yun.itxdl.cn/online/server/index.php?u=5Javascript /online/js/index.php?u=5 CTO訓練營http://yun.itxdl.cn/online/cto/index. http://yun.itxdl.cn/online/cto/index..
以上就介紹了程式設計師面試:電話面試問答Top 42(下),包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。