好的面試官能夠能好的和面試者互動,而一場好的面試也能帶給面試者更多的思考
面試官給我出題後的 1 分鐘內,我給出了第一種思路:排序。
將數字按公升序排序,去除最小的那個數即可。
存在問題:時間複雜度高,只考慮了正數的情況。
面試官給出了第一次提示時間複雜度過高,要求降低時間複雜度。
於是在經過幾分鐘思考後,我給出了乙個錯誤的動態規劃的思路。
面試官進一步提示我:這道題可以用很簡單的方法解題,不用什麼高深的演算法。
於是我調整了一下思路繼續思考問題,根據基本的幾種情況進行了推導。
1、無負數情況下,取出最小值即可。
2、有負數情況下,根據負數的計數偶數個數來判斷是取出,負數絕對值最小值,還是非負數絕對值最小值。
根據這個推斷我們只需要一次遍歷,記錄負數個數,同時記錄負數、非負數絕對值最小者。
於是我將思路講給面試官,他笑了笑說,這個思路是對的,但是不能給我滿分,要我再好好想一下,檢查一下。
我知道,應該是有一些邊界值還沒有處理好,但是看了幾分鐘,還是沒有找出問題。(人在緊張的情況下,思路會不太清晰)
於是,面試官指出了我面試中存在的問題,純負數情況下,奇數個負數,應該排除絕對值奇數個,對於 0 這個邊界值,也沒有考慮到。一共應該是有 12 個分支,而我的**只考慮了其中的 3、4 個(文章後面會畫**釋)。
面試官進一步指導:在實際的**開發中,可能並不會用太多高深的演算法,但是像這道題一樣的簡單問題卻很常見,我們需要考慮**的健壯性,上線的**僅考慮到 90% 的情況是錯誤的。
為什麼是 12 個分支?
三個初始分支 n 個數都為非負數、n 個數有正有負、n 個數都為負數,以及 n 個數中是否存在 0,負數個數的奇偶個數 推導 332 = 12 個分支(0個負數視作偶數個,去除 2 個不存在情況,還剩 10 種需要考慮的情況)
實際可能出現的答案有三種:
1、無負數、有正有負且負數個數為偶數時,去除非負數絕對值最小者。
2、n 個數都為負數且負數個數個數為偶數時,去除負數絕對值最大者。
3、負數個數為奇數時,取負數絕對值最小者。(有正有負且存在 0,負數個數為奇數個可以去除任意非 0 數)
轉換為實際**:
/*
找出去除後集合乘積能達到最大的那個數
*/int
findmaxproductnum
(int
nums)
else
if(nums[i]==0
)else}if
(count ==0||
(count
(count&1)
==0))
else
if(count==nums.length&&
(count&1)
==0)else
}
這道題的目的是什麼?
考察乙個求職者**的健壯性,即能不能考慮全面,將問題的每個分支處理好。(可以先分解出輸入的邊界值,根據不同組合的分支推導結果。)
1、 面試過程中,不要急於解題,要和面試官確認好問題的邊界。如果未明確,**的健壯性就很有可能出現問題。
2、出錯不要怕,好的面試官會引導你解題,注意提出問題後面試官給出的提示,這都是解題的方向。
3、幾輪的面試是很累的,前一天做好休息,面試過程中不要太緊張,會影響發揮,喝喝水調整下呼吸,放鬆下自己。
一道面試題引發的思考
首先我們給出這道面試題的 以及題目 lista new arraylist list.add 1 list.add 2 for string item list 問 上段 執行會報錯嗎?如果把 1 換成 2 會報錯嗎?為什麼?首先給出答案 上面這段 執行不會報錯。把 1 換成 2 再執行就會報錯。為...
一道面試題的思考
在繼承中new和override相同點和區別?看下面的 有乙個基類a,b1和b2都繼承自a,並且使用不同的方式改變了父類方法print 的行為。測試 輸出什麼?為什麼?public void dotest public class a public class b1 a public class b...
百度一道面試題引發的思考
下面我將寫寫我對這道題的本質思考得到的三種方法 以下方法都對應函式的名字 一 sumget方法 這個題說只有乙個數是重複的,那撇開這個數,也就是說1到100的數都會出現,於是我把所有101個數相加起來,最後再減去1到100的和,不就出來了嗎?二 flagget方法 做標記是乙個好方法。可以建立乙個陣...