麵試經之一道淘汰85%麵試者的百度開發者麵試題
本文在再次更新,感謝@PhoneGap提供另一中解題思路,,感覺那個方法也挺好的,大家可以看一下第三種解決方案。。
剛在網上看到一篇文章,標題為 一道淘汰85%麵試者的百度開發者麵試題,感覺好難的樣子,就默默的進去看了一下,首先來看一下原題吧。
題目描述:
依序遍曆0到100閉區間內所有的正整數,如果該數字能被3整除,則輸出該數字及‘*’標記;如果該數字能被5整除,則輸出該數字及‘#’標記;如果該數字既能被3整除又能被5整除,則輸出該數字及‘*#’標記。
提示:
這道看似非常簡單的題目,卻潛藏著幾個玄機。麵試官通過這道題,考察學生在語法、語義、語用以及算法優化方麵的能力。現實告訴我們,通過這一道題目,就可以淘汰85%的麵試者。看似殘酷的考察方式,卻也體現出學生在基礎知識、動手能力到思維能力上的差距。
需要注意的考察點:
- 語法:語法的正確書寫,包括格式
- 語義:對循環、分支等語義的理解與掌握
- 語用:對變量命名、表達式及語句的組合使用
- 算法優化:如果要提高運行效率,可以在算法上尋找突破口,也可以采用空間換時間的通用原則。
勐一看題目確實不難,但容易犯暈,我的第一思路是直接三個if語言搞定,但仔細想想會有重複輸出,例如,15能被3和5整除,判斷的時候就會出問題,但是自學拍一下if語句就沒啥問題了,例如,把判斷既能被3整除又能被5整除放在一個條件判斷,下麵來看一下具體的代碼吧。
public class Baidu{ public static void main(String[] args){ for(int i=1;i<=100;i++){ if(i%3==0&&i%5==0){ System.out.println(i+"*#"); }else if(i%3==0){ System.out.println(i+"*"); }else if(i%5==0){ System.out.println(i+"#"); } } } }
第二個思路是先判斷一下是否能被3整除,在內層循環中再判斷是否能被5整除,如果能就輸出,當然首先要定義一個中間量。。還是直接看代碼容易理解。。。
public class Baidu{ public static void Print(){ String result=""; for(int i=1;i<=100;i++){ if(i%3==0){ result=i+"*"; if(i%5==0){ result+="#"; } System.out.println(result); continue; }else if(i%5==0){ result=i+"#"; System.out.println(result); } } } public static void main(String[] args){ Print(); } }
此方法還可以再優化一下,詳情請看結尾。。
下麵是第三種方法感謝@PhoneGap提供,詳情請看評論我說一下思路吧,主要是用StringBuffer來控製輸出結果,就是先指定一個空串來作為輸出結果,如果i能被3整除就吧*附加到結果上來,如果能被5整除就把再把#附加到結果上來,或許你有些暈,還是直接看代碼慢慢理解比較好。。
public class Baidu3{ public static void main(String[] args){ String result=""; for(int i=1;i<=100;i++){ result=i%3==0?"*":""; result+=i%5==0?"#":""; if(!"".equals(result)){ System.out.println(i+result); } } } }
我以前談到過用StringBuffer或StringBuilder來優化這個方法,但是很多朋友還不是很理解,下麵我把第四種方法羅列出來,如果你還不熟悉StringBuffer或StringBuilder,請參看StringBuilder和StringBuffer解析,下麵是完整的程序:
public class Baidu4{ public static void main(String[]args){ StringBuilder result=new StringBuilder(); for(int i=1;i<=100;i++){ result.append( i % 15 == 0 ? i + "*#\r\n" : i % 3 == 0 ? i + "*\r\n" : i % 5 == 0 ? i + "#\r\n" : ""); } System.out.println(result); } }
方法5:這種方法很也比較簡單,就不多解釋了,請看源代碼。
public class Baidu5{ public static void main(String[]args){ StringBuilder result=new StringBuilder(); for(int i=1;i<=100;i++){ result.append( i % 3 == 0 ? "*":""); result.append(i % 5 == 0 ? "#" : ""); System.out.print(result.length()>0?i:""); System.out.println(result); result.setLength(0); } } }
方法6:和前邊的思路有點不同,輸出結果也沒有按順序輸出,但是符合題意。。
思路很簡單,我直接上源碼,如有其它問題,可以聯係我。。
public static void main(String[] args){ StringBuilder result=new StringBuilder(); for (int i = 3; i <= 100; i += 3) { if (i % 5 != 0) result.append(i + "*\r\n"); } for (int i = 5; i <= 100; i += 5) { if (i % 3 == 0) { result.append(i+ "*#\r\n"); } else { result.append(i+ "#\r\n"); } } System.out.println(result); } }
感覺這道題的第三種和第四種,第五種方,第六種法挺不錯的,第六種思路挺不錯的。但是三目運算符在運算的時候也會進行判斷運算,感覺第一種方法簡單明了,就是判斷次數過多,第四種運行效率比較高。如果有更好的思路,歡迎探討,
以下代碼是百度專家提供的解題方法,供你參考。
public void foo() { final int COUNT = 100; boolean isMod3; boolean isMod5; for (int i = 1; i <= COUNT; i++) { isMod3 = i % 3 == 0; isMod5 = i % 5 == 0; if (isMod3 && isMod5) { System.out.println(i + " *#"); } else if (isMod3) { System.out.println(i + " *"); } else if (isMod5) { System.out.println(i + " #"); } } }
最後更新:2017-04-03 12:56:27