這是一個源自知乎的話題,原貼鏈接:一道百度的面試題,有大神會嘛?
雖然我不是大神,但我也點進去看了一下,思考了一會之后有了一些思路,然后去看其它人的答案的時候果然全都已經被各路大神們先想到並貼出來了,所以我就不去湊熱鬧寫重復答案了,整理一下網友們的智慧在這里自娛自樂好了。
題目
思路一
作為一個多年前也見過不少筆試題的少年,看到這個題目的第一想法是腦筋急轉彎——注入一段邏輯直接改變原 if 結構。
解法一
填入內容 true){System.out.print("a");}if(false
。
public void print() { if (true) { System.out.print("a"); } if (false) { System.out.print("a"); } else { System.out.print("b"); } }
類似地也可以填入 true){System.out.print("ab");return;}if(false
等。
當初大學時單純的少年可是很難想出這樣的套路的,時間改變了我們啊。
思路二
如果正經遵從題目的原代碼結構,那就得想辦法構造一段代碼,既能輸出 a
,又能返回 false
。
解法二
我也想到能否使用 System.out.print
的返回值來做文章,但奈何並不記得它返回什么,首先讓我們復習一下 PrintStream
的 print
、println
和 printf
方法的區別:
方法 | 功能 | 返回值 |
---|---|---|
打印一個值或者對象 | void | |
println | 打印並換行 | void |
printf | 格式化打印 | PrintStream |
所以適用的是 printf
,它的返回值是 PrintStream
類型的 System.out
,判它是否為空即可。
填入內容 System.out.printf("a") == null
。
public void print() { if (System.out.printf("a") == null) { System.out.print("a"); } else { System.out.print("b"); } }
經測試填入 System.out.append("a") == null
也是可以達到效果的。
解法三
仍然是思路二,但從匿名內部類來作文章。
實現代碼:
public void print() { if (new Object() { boolean print() { System.out.print("a"); return false; } }.print()) { System.out.print("a"); } else { System.out.print("b"); } }
這里利用的知識點是匿名內部類可以聲明基類沒有的新方法並且馬上調用。
解法四
使用 Java 8 里的 lambda 來實現思路二。
public void print() { if (((BooleanSupplier)(() -> {System.out.print("a");return false;})).getAsBoolean()) { System.out.print("a"); } else { System.out.print("b"); } }
嚴格來講這個不一定能算作正確答案,因為要增加 import java.util.function.BooleanSupplier;
。
腦洞大開
講完嚴肅的解法,來看看網友 窮小子 開腦洞的思路:
public void print() { // if ( ) { System.out.print("a"); // } else { System.out.print("b"); // } }
如果沒有特意說明只能在括號里加東西,倒真是個妙計!
同樣看得我一愣一愣的還有 caiwei 同學的答案,他和朋友們發現題目里少寫了個大括號(真的),於是我們看到他的朋友老方的解決方案:
真是防不勝防啊~不過我喜歡!