一日3道——android 面试算法题解(1)

**

一日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;i2;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

你可能感兴趣的:(android-面试)