這多是歷史上最簡單的一道java面試題了。java
題目很簡單,完成代碼,判斷一個整數是不是奇數:程序員
public boolean isOdd(int i)
相信至關數量的人都已經在準備吐槽了,只要看過《編程珠璣》的人都知道這道題的答案和其中極爲簡單的道理。不過彆着急罵街,無論你信不信,這道筆試題我拿到的答案好多都長這樣:面試
public boolean isOdd(int i) { if (i % 2 == 1) { System.out.println("是奇數"); } else { System.out.println("是偶數"); }}
而後編譯一下,發現錯誤了,撓撓頭,頂多改爲這樣:編程
public boolean isOdd(int i) { if (i % 2 == 1) { return true; } else { return false; }}
好吧,我認可我在篩選簡歷的能力可能有一些問題,不過無論你信不信,好多大廠工做了幾年的程序員,都會寫出如上風格的代碼。微信
因而我繼續進行引導:架構
我:「這個函數的定義要求返回一個什麼類型的值?」函數
候選人看了看題幹:「布爾類型。」測試
我:「那麼,你if後面的括號裏面的表達式的值是一個什麼類型的?」優化
引導到這一步的時候,依然有高達兩成的候選人選擇了放棄,表示他們不知道。好吧,我真的不知道大家來面試這個職位的信心何在。不過大部分人想了想,還會回答出正確答案:spa
候選人:「也是布爾類型。」
我:「而後呢?」
有少許候選人雖然沒說出來,可是我能看出來他們以爲這只是一個巧合,並不知道怎麼進行下一步。不過,大多數人想了想以後,仍是會優化成以下代碼:
public boolean isOdd(int i) { return i % 2 == 1;}
終於過了第一關了,進行第二關的引導:
我:「那我傳進來一個-1呢?」
將近一半的人在想了想以後會嘴硬地表示他們從小被教導只有天然數纔有奇數偶數之分,負數沒有奇偶這一說。剩餘的人接受了這個設定,想了一下子,改爲這樣:
public boolean isOdd(int i) { return i % 2 == 1 || i % 2 == -1;}
而且在提示以後優化成這樣:
public boolean isOdd(int i) { return i % 2 != 0;}
好吧,這是迄今爲止第一個能經過編譯且徹底知足了需求的代碼實現了。說實話,一開始就寫成這樣的人,若是沒有其餘什麼明顯的缺點的話,我這裏基本就能經過了。我認可個人要求比較低,可是來面試的人能直接寫出這樣的真的不太多,粗略地估計的話,大概佔一到兩成吧。
可是這裏還沒完呢,還有最重要的第三關呢:
我:「有更好的辦法嗎?」
候選人:「?」
我:「我以爲取模操做比較慢,有更快的解決方案嗎?」
除了少數人能本身想一想就想出來了以外,絕大部分(絕不誇張)候選人表示沒有或者不知道,因而進行下一步提示:
我:「奇數和偶數轉換成二進制有什麼區別?」
至關一部分候選人表示本身不懂什麼叫二進制和位運算,有的還表示java不是c語言,不用研究這些,就跟不少評論會吐槽我在裝逼同樣。少部分候選人想了想,會怯怯地回答。
候選人:「奇數最後一位是1,偶數最後一位是0。」
我:「而後呢?」
這裏很奇怪的點是,大部分能聊到這裏來的候選人會想起來移位操做,我真的不知道是爲何,雖然這道題確實能夠有這種操做:
public boolean isOdd(int i) { return i >> 1 << 1 != i;}
可是這根本不是重點好吧!!!
總之,不管如何,能在第三關的各類引導以後,能寫出下面這個結果來的人,真的很少。能一開始沒有任何引導的就寫出來的人,至今只見過兩個,一個我去哪兒都帶着,一個拒了個人offer。
public boolean isOdd(int i) { return (i & 1) == 1;}
別覺得這就完了!終極boss來了:
我:「這樣是否是比上面取模運算要快?」
候選人:「那固然了,位運算確定快啊。」
我:「可是咱們實際代碼測試過,發現上面的按位與操做和取模操做,實際運行的時間是差很少的,爲何呢?」
候選人內心mmp:「鬧了半天你這是在逗我玩啊???」
然而真正能回答出緣由來的人,面試過程當中我沒見過,多是大牛都看不上我所在的公司吧。只有在某公司的時候,一個同事想了想,給出了我正確答案。
難道是我經歷的公司都太low了麼……
寫在最後
老鐵們,關注個人原創微信公衆號「Java架構師聯盟」,專一於有趣有益的程序人生,保證你看完有所收穫,不信你打我。