偶然看到騰訊一個報道《15道燒糊大腦的蘋果面試題》,裏面有些很好算法題,就自己動手寫了一下,尋求點樂趣。
出處URL:http://tech.qq.com/a/20120611/000062.htm#p=8
public class AppleDemo00 {
/**
* @author 州偉
* @param args
* 現在有100個標記過的電燈泡。第一個人經過這些燈時,點亮所有的燈,第二個人經過時每隔一盞燈就切換開關一次,
* 第三個人經過時每隔兩盞燈切換開關一次。
* 請問,當第100個人經過時,還剩多少盞亮着的燈?
*/
public static void main(String[] args) {
//初始化一個數組 ,數組元素 0:關燈、1:開燈
int[] preLights = new int[100]; //初始化元素都爲0,默認關燈
for(int a : preLights){
System.out.print(a + " ");
}
for(int i=1;i<=100;i++){ //100個人
for(int j=0;j<100;j=j+i){ //
if(j==0 && i==1){ //第一個人路過時,第一站燈
preLights[j] = turnOnorOffLight(preLights[j]);
}else{
if(j>1){
preLights[j-1] = turnOnorOffLight(preLights[j-1]);
}
}
}
}
System.out.println();
System.out.println("輸出------------------");
//輸出
for(int a : preLights){
System.out.print(a + " ");
}
//輸出描述
System.out.println();
for(int i=0;i<100;i++){
if(preLights[i] != 0){
System.out.print(i+1 + ", ");
}
}
System.out.println();
//發現:結果是完全平方數
System.out.println("綜上發現:結果是完全平方數:1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9,是否有更好的算法呢???");
}
private static int turnOnorOffLight(int a){
switch (a) {
case 0:
return 1;
case 1:
return 0;
}
return -1;
}
}
輸出結果:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
輸出------------------
1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1, 4, 9, 16, 25, 36, 49, 64, 81,
綜上發現:結果是完全平方數:1*1,2*2,3*3,4*4,5*5,6*6,7*7,8*8,9*9,是否有更好的算法呢(看補充)!
希望大家有更好的算法,提供些思路,共同進步。
+
補充:謝謝大家的回覆,讓我收益頗多,下面我做了些總結:
做了一個草圖:10(縱10人)X10(橫10棧燈)
第一個人:1 1 1 1 1 1 1 1 1 1
第二個人:0 1 0 1 0 1 0 1 0 1
第三個人:0 0 1 0 0 1 0 0 1 0
第四個人:0 0 0 1 0 0 0 1 0 0
第五個人:0 0 0 0 1 0 0 0 0 1
第六個人:0 0 0 0 0 1 0 0 0 0
第七個人:0 0 0 0 0 0 1 0 0 0
第八個人:0 0 0 0 0 0 0 1 0 0
第九個人:0 0 0 0 0 0 0 0 1 0
第十個人:0 0 0 0 0 0 0 0 0 1
從上面的片段中我們看到,第一盞燈:1,第二盞燈:1、2 第三盞燈:1、3 第四盞燈:1、2、4 第五盞燈:1、5 第六盞燈:1、2、3、6 第七盞燈:1、7 第八盞燈:1、2、4、8 第九盞燈:1、3、9 第四盞燈:1、2、5、10 略。
綜上:相信大家已經看出來了:
凡是最後亮的燈,都被按過奇數次每盞燈被按的次數,即等於它的約數的個數,比如8號燈,它被第1、2、4、8這四個人按到,所以最後是滅的狀態,再比如16號燈,它被第1、2、4、8、16這五個人按到,所以最後是開的狀態。
結論:最後,只有完全平方數,其約數個數爲奇數,就是亮燈的情況。
這其實就是純粹的數學問題,沒有必要用code去實現了。