**
一日3道——android 面试算法题解(1)
**
1, 一个房间有100盏灯(全是关着的),由编号1-100的开关(只有两种状态,开或者关)控制,门外有100个学生,学生按次序一次进入房间,第一个进入的学生切换是1的倍数的开关,第二个学生切换是2的倍数的开关,以此类推,问,第100学生进入切换后,还有多少盏灯是亮着的?
/**正常思维*/
public void test1(){
boolean[] light = new boolean[100];//初始化100盏灯
for (int i = 1;i<=100;i++){//第多少人
for (int j = 1;j<=100;j++){//第多少灯
if(j%i==0){//如果能被整除,则改变灯灯状态
light[j-1] =!light[j-1];
}
}
}
//遍历输出结果
for (int i =0;i<100;i++){
if(light[i]){
System.out.print(i+1+" ");
}
}
}
/**最佳方案*/
public void test1v(){
//由规律我们可以看出1到100中,只有完全平方数(1,4,9,16,25,36,49,64,72,100)的约数是奇数个,
for (int i=1;i*i<=100;i++){
System.out.print(i*i+" ");
}
}
打印结果
1 4 9 16 25 36 49 64 81 100
2,写一个字符串倒序的算法,请勿使用系统api
/**正常思路*/
public void test2(){
String str = "abcdefghijklmnopqrstuvwxyz";//要倒叙灯字符串
char[] ch = str.toCharArray();//把string转char[]
int size = ch.length;//获取字符串灯值长
char[] ch1 = new char[size];
int j = 0;
for (int i = size-1;i>=0;i--){//把结果遍历
ch1[j++] = ch[i];
}
System.out.println(ch1);
}
/**最佳方案*/
public void test2v(){
String str = "abcdefghijklmnopqrstuvwxyz";//要倒叙灯字符串
char[] ch = str.toCharArray();//把string转char[]
int size = ch.length;//获取字符串灯值长
for (int i = 0;i<size/2;i++){//把结果分成两等份,将最后一个和第一个掉头
char j = ch[i];
ch[i] = ch[size-i-1];
ch[size-i-1] = j;
}
System.out.println(ch);
}
打印结果
zyxwvutsrqponmlkjihgfedcba
3,有一个三位数,个位是c,十位是b,百位是a,求满足abc + cba = 1333的abc
/**正常思路*/
public void test3(){
//因为a,c都是都在百位数上,
// 所以a,c均大于0
for (int a = 1;a<10;a++){
for (int b=0;b<10;b++){
for (int c=1;c<10;c++){
if(a*100+b*10+c + c*100+b*10+a == 1333){
System.out.printf("abc=%d%d%d\n",a,b,c);
}
}
}
}
}
/**最佳方案*/
public void test3v(){
//因为a,c都是都在百位数上,
// 所以a,c均大于0,又由a+c个位数为3,
// 又由于abc+cba=1333的a+c>10,
// 所以可以得到a+c = 13,b+b = 2
// 所以b=1,
// 假设a最大为9,则b最小值为4,同理,a的最小值也为4
int amin=4,b=1,cmin=4;
for (int a = amin;a<10;a++){
for (int c = cmin;c<10;c++){
if(a+c==13){
System.out.printf("abc=%d%d%d\n",a,b,c);
}
}
}
}
打印结果
abc=419
abc=518
abc=617
abc=716
abc=815
abc=914