技術面試題看似清晰明確實則模糊不清,因此務必多提問題以澄清所有存疑之處。問到最後,你可能會發現,這個問題與你最初預想的截然不同——也許更難,也許更簡單。實際上,許多面試官(尤其是微軟的)會特意考察你 能否提出好問題。
好問題大概是這樣的:資料型別是什麼?有多少資料?解決這個問題需要什麼假定條件?使用者都是誰?
示例:「設計一種列表排序演算法。」
回答:陣列。
回答:數字。
回答:是的。
回答:顧客年齡。
回答:大概一百萬。
現在我們要解決乙個與最初理解很不一樣的問題:對乙個包含一百萬個整數的陣列進行排序,這些整數在0到130(乙個合理的最高年齡)之間。該怎麼解決這個問題呢?只需要建立乙個包含130個元素的陣列,然後計算每乙個元素出現的次數。
演算法的設計可能會很難,不過下一節的「演算法題的五種解法」可以幫上大忙。在設計演算法時,記得問問自己以下幾個問題:
該演算法的空間和時間複雜度如何?
碰到大量資料會怎麼樣?
你的設計會引發其它問題嗎?例如,你設計了一種二叉查詢樹的變體,那麼該設計是否會影響插入、查詢或刪除時間?
如果面試官指定特定資料(例如,前面提到待處理資料是年齡值,或按一定順序排列的),你能否善用該資訊?面試官給你特定資訊往往是有原因的。
你給出蠻力解法,這麼做當然是允許的,甚至推薦這麼做。然後,在此基礎上不斷優化。很顯然,面試官總是期望你能給出盡可能最優的解法,但這並不意味著一開始就得給出完美無瑕的答案。
先寫偽碼有助於你理清思路,減少犯錯的次數。不過,務必先跟面試官打聲招呼,你會先寫偽碼,緊接著就會編寫「真實的」**。許多求職者選擇寫偽碼,意在「逃避」編寫真實**,你肯定不願與那些求職者為伍。
編寫**不要太倉促;實際上,太倉促很可能會害了自己。寫**時只管放鬆步調,做到有條不紊,絲絲入扣。另外,切記以下忠告。
多用資料結構:根據實際情況選用合適的資料結構,或者自己定義資料結構。例如,有個面試題涉及從一群人中找出年齡最小的,不妨考慮定義乙個資料結構person表示乙個人。這樣也能展現你注重良好的物件導向設計。
寫**不要太雜亂:這看似小事一樁,實則很重要。在白板上寫**時,盡量從左上角而不是中間開始寫。這樣才有足夠的地方從容答題。
如果你的演算法很複雜或涉及大量數值操作(移位、算術運算等),建議編寫**邊測試,而不是寫完**再測試。
發現錯誤時(這是難免的),務必先弄清楚出現缺陷的原因再作修改。你肯定不希望自己在面試官看了像熱鍋上的螞蟻一樣團團亂轉,這裡修修那裡補補。舉個例子,我就碰到過這樣的求職者,他發現函式碰到某個特定值返回true而非正確的false,於是直接修改返回值,接著驗證函式能否工作。這或許可以修改那種特定情況下出現的問題,但無疑又會滋生新的問題。
當你覺察**中存在的問題時,務必三思而後改,先理清**失效的原因。這樣你才能寫出既漂亮又整潔的**,也會越寫越快。
——摘自《程式設計師面試金典(第5版)》
doe五步法 試驗設計DOE的五步曲
無論是在工程技術 質量管理 產品研發等方面,還是在近來熱門的六西格瑪領域,試驗設計doe都是我們解決問題的好幫手,其應用可以說涵蓋了包括機械 電子 化工 汽車 菸草 醫藥 食品 銀行 電信 物流等所有的行業。眾所周知,各類高科技公司的產品本身及其製造工藝千差萬別,小到英特爾公司生產的cpu晶元,大到...
學習之道 威力無比的難題解決的五步法
學習之道 威力無比的難題解決五步法 開啟智慧型大門的密鑰匙 平等思維唐曾磊 在我們的學會學習班上,我們一直在教會孩子們執行學會的三個標準,但很多學生在沒有執行好學會的三個標準的時候,很希望能夠有簡單的方法解決他們遇到的難題,於是,為了幫助孩子們更好地解決他們不會做題的問題,我們推出這套難題解決五步法...
假設思考五步法,快速成為問題解決高手
培訓收益 快速掌握諮詢顧問們都在用的解決問題和匯報提案的工具方法。培訓物件 所有管理者 課程大綱 第一部分 如何快速成為解決問題的高手 1 假設思考法的優勢 2 假設思考五步法 以終為始,自上而下構建,自下而上論證 3 如何在三個月之內扭轉銷售收入下滑趨勢?案例演示 4 假設思考與分析思考的區別 5...