历史上最简单的一道Java面试题,但无人能通过
作者:方志宏
來(lái)源:zhuanlan.zhihu.com/p/57859872
這可能是歷史上最簡(jiǎn)單的一道java面試題了。
題目很簡(jiǎn)單,完成代碼,判斷一個(gè)整數(shù)是否是奇數(shù):
public?boolean?isOdd(int?i)相信相當(dāng)數(shù)量的人都已經(jīng)在準(zhǔn)備吐槽了,只要看過(guò)《編程珠璣》的人都知道這道題的答案和其中極為簡(jiǎn)單的道理。不過(guò)別著急罵街,不管你信不信,這道筆試題我拿到的答案好多都長(zhǎng)這樣:
public?boolean?isOdd(int?i)?{if?(i?%?2?==?1)?{System.out.println("是奇數(shù)");}?else?{System.out.println("是偶數(shù)");} }然后編譯一下,發(fā)現(xiàn)錯(cuò)誤了,撓撓頭,頂多改成這樣:
public?boolean?isOdd(int?i)?{if?(i?%?2?==?1)?{return?true;}?else?{return?false;} }好吧,我承認(rèn)我在篩選簡(jiǎn)歷的能力可能有一些問(wèn)題,不過(guò)不管你信不信,好多大廠工作了幾年的程序員,都會(huì)寫出如上風(fēng)格的代碼。
于是我繼續(xù)進(jìn)行引導(dǎo):
我:“這個(gè)函數(shù)的定義要求返回一個(gè)什么類型的值?”
候選人看了看題干:“布爾類型。”
我:“那么,你if后面的括號(hào)里面的表達(dá)式的值是一個(gè)什么類型的?”
引導(dǎo)到這一步的時(shí)候,依然有高達(dá)兩成的候選人選擇了放棄,表示他們不知道。好吧,我真的不知道你們來(lái)面試這個(gè)職位的信心何在。不過(guò)大部分人想了想,還會(huì)回答出正確答案:
候選人:“也是布爾類型。”
我:“然后呢?”
有少量候選人雖然沒說(shuō)出來(lái),但是我能看出來(lái)他們覺得這只是一個(gè)巧合,并不知道怎么進(jìn)行下一步。不過(guò),大多數(shù)人想了想之后,還是會(huì)優(yōu)化成如下代碼:
public?boolean?isOdd(int?i)?{return?i?%?2?==?1; }終于過(guò)了第一關(guān)了,進(jìn)行第二關(guān)的引導(dǎo):
我:“那我傳進(jìn)來(lái)一個(gè)-1呢?”
將近一半的人在想了想之后會(huì)嘴硬地表示他們從小被教導(dǎo)只有自然數(shù)才有奇數(shù)偶數(shù)之分,負(fù)數(shù)沒有奇偶這一說(shuō)。剩余的人接受了這個(gè)設(shè)定,想了一會(huì)兒,改成這樣:
public?boolean?isOdd(int?i)?{return?i?%?2?==?1?||?i?%?2?==?-1; }并且在提示之后優(yōu)化成這樣:
public?boolean?isOdd(int?i)?{return?i?%?2?!=?0; }好吧,這是迄今為止第一個(gè)能通過(guò)編譯且完全滿足了需求的代碼實(shí)現(xiàn)了。說(shuō)實(shí)話,一開始就寫成這樣的人,如果沒有其他什么明顯的缺點(diǎn)的話,我這里基本就能通過(guò)了。我承認(rèn)我的要求比較低,但是來(lái)面試的人能直接寫出這樣的真的不太多,粗略地估計(jì)的話,大概占一到兩成吧。
但是這里還沒完呢,還有最重要的第三關(guān)呢:
我:“有更好的辦法嗎?”
候選人:“?”
我:“我覺得取模操作比較慢,有更快的解決方案嗎?”
除了少數(shù)人能自己想想就想出來(lái)了之外,絕大部分(毫不夸張)候選人表示沒有或者不知道,于是進(jìn)行下一步提示:
我:“奇數(shù)和偶數(shù)轉(zhuǎn)換成二進(jìn)制有什么區(qū)別?”
相當(dāng)一部分候選人表示自己不懂什么叫二進(jìn)制和位運(yùn)算,有的還表示java不是c語(yǔ)言,不用研究這些,就跟很多評(píng)論會(huì)吐槽我在裝逼一樣。少部分候選人想了想,會(huì)怯怯地回答。
候選人:“奇數(shù)最后一位是1,偶數(shù)最后一位是0。”
我:“然后呢?”
這里很奇怪的點(diǎn)是,大部分能聊到這里來(lái)的候選人會(huì)想起來(lái)移位操作,我真的不知道是為什么,雖然這道題確實(shí)可以有這種操作:
public?boolean?isOdd(int?i)?{return?i?>>?1?<<?1?!=?i; }但是這根本不是重點(diǎn)好吧!!!
總之,無(wú)論如何,能在第三關(guān)的各種引導(dǎo)之后,能寫出下面這個(gè)結(jié)果來(lái)的人,真的不多。能一開始沒有任何引導(dǎo)的就寫出來(lái)的人,至今只見過(guò)兩個(gè),一個(gè)我去哪兒都帶著,一個(gè)拒了我的offer。
public?boolean?isOdd(int?i)?{return?(i?&?1)?==?1; }別以為這就完了!終極boss來(lái)了:
我:“這樣是不是比上面取模運(yùn)算要快?”
候選人:“那當(dāng)然了,位運(yùn)算肯定快啊。”
我:“但是我們實(shí)際代碼測(cè)試過(guò),發(fā)現(xiàn)上面的按位與操作和取模操作,實(shí)際運(yùn)行的時(shí)間是差不多的,為什么呢?”
候選人心里mmp:“鬧了半天你這是在逗我玩啊???”
然而真正能回答出原因來(lái)的人,面試過(guò)程中我沒見過(guò),可能是大牛都看不上我所在的公司吧。只有在某公司的時(shí)候,一個(gè)同事想了想,給出了我正確答案。難道是我經(jīng)歷的公司都太low了么……
總結(jié)
以上是生活随笔為你收集整理的历史上最简单的一道Java面试题,但无人能通过的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东大型API网关实践之路
- 下一篇: Hutool Java 工具类库导出 E