麵試經之一道淘汰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