閱讀853 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go [算法係列之二]二叉樹各種遍曆
  下一篇:go 客戶端登錄界麵,根據輸入框的彈出改變界麵樣式,解決鍵盤擋住輸入框的問題