java程序員面試竟然被一道求奇數題難倒nunb%2==1這樣寫被勸退了


本人最近幾年一直在做java後端方面的技術面試官,而在最近兩週,又密集了面試了一些java初級和高級開發的候選人,在面試過程中,我自認為比較慎重,遇到問題回答不好的候選人,我總會再三從不同方面提問,只有當反覆確認能力不行才會下結論,相反,如果候選人給我的印象不錯,我也會從多個角度來衡量,以免招進會說但不會幹活的“大忽悠”。


總的來說在這行做過新人也做過老帶新,自己平時也比較喜歡鑽研技術所以剛剛入這行的時候老師傅對我還是不錯的。

自從當上了主程之後不僅自己寫代碼也要對hr招的人施行種種考驗,畢竟只有招到合格的同事才不至於在工作中拖後腿。

在工作之餘和其他合作過公司的人事聊天中突然就聊到那麼一個話題。

對方說有一次有一個剛剛畢業的程序來面試,經理就給了一個很容易的題“給你一個隨機數怎麼判斷是奇數還是偶數”?


來面試的人毫不猶豫地就寫下了代碼:


public static boolean isOdd(int numb) {


return numb%2==1;

}


經理看到這幾行代碼就他走了。

其實這幾行代碼看起來是沒有什麼問題的,正常來講被2整除餘數為1的整數就是奇數,所以在邏輯上看是沒有問題的。

可是在java中,上面的這段程序有一半的機會是運行出錯的,導致得不到想要的結果。你能想出來是為什麼嗎?

因為在java中int有一半的數是負數。如果你填-100或者-101會得到什麼結果?

取餘操作符在運算表達試中,其運算結果的符號同左操作數的正負結果相同,所以如果i是負奇數,則此表達式的結果會是-1,而不是1。

這是很多新手愛犯的錯誤。

那麼該如何改進這段程序呢?

可以修改成numb%2!=0,

完整表達為

public static boolean isOdd(int numb) {


return numb%2!=0;

}

如果要追求效率還可以這樣改進

public static boolean isOdd(int numb) {


return (numb&1)!=0;

}


在不然也可以這樣



public static boolean isOdd(int numb) {


return (numb&1)==1;

}

教大家寫三種的正確方法

大家可要記住這個坑喔!

你讓你同事寫寫看要不他也會犯這個錯。


java程序員面試竟然被一道求奇數題難倒nunb%2==1這樣寫被勸退了


分享到:


相關文章: