Android算法面试题(1)

Android算法面试题(1)

相信Android程序猿在找工作的过程中经常会遇到面试算法,下面是我记忆中的一些面试题,整理如下(尊重原创,转载请注明出处。原文地址):

1, 一个房间有100盏灯(全是关着的),由编号1-100的开关(只有两种状态,开或者关)控制,门外有100个学生,学生按次序一次进入房间,第一个进入的学生切换是1的倍数的开关,第二个学生切换是2的倍数的开关,以此类推,问,第100学生进入切换后,还有多少盏灯是亮着的?
private static void light()
    {
        int N = 100;
        int[] light = new int[N];
        for (int k = 1; k <= N; k++)
        {
            for (int i = 1; i <= N; i++)
            {
                int index = k * i - 1;
                if (index < N)
                {
                    light[index] = light[index] + 1;
                }
                else
                {
                    break;
                }
            }
        }
        for (int i = 1; i <= N; i++)
        {
            if (light[i - 1] % 2 != 0)
            {
                System.out.print(i + "(" + light[i - 1] + ")\t");
            }
        }
    }

程序输出:

1(1)    4(3)    9(3)    16(5)   25(3)   36(9)   49(3)   64(7)   81(5)   100(9)  

分析
第一种思路:
第一个人切换的开关编号为i,i∈[1,n];
第二个人切换的开关编号为2i,i∈[1,n/2];
.
.
.
第k个人切换的开关编号为ki,i∈[1,n/k];
故,把所有切换的开关次数做和,由于一开始是关着的,所以只有奇数次切换,最后的状态才是开着的。

第二种思路:
1到100中,只有完全平方数(1,4,9,16,25,36,49,64,72,100)的约数是奇数个,故,最终只有这些编号的电灯是亮着的。

2,写一个字符串倒序的算法,请勿使用系统api
private static void strRevers()
{
    char[] str = "abcdefghijkl".toCharArray();
    int len = str.length;
    for (int i = 0; i < len / 2; i++)
    {
        char c = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = c;
    }
    System.out.println(str);
}
3,有一个三位数,个位是c,十位是b,百位是a,求满足abc + cba = 1333的abc
private static void f3()
    {
        int b = 1;
        for (int a = 0; a <= 9; a++)
        {
            for (int c = 0; c <= 9; c++)
            {
                if (a + c == 13)
                {
                    System.out.println(a + "" + b + "" + c);
                }
            }
        }
    }

分析
由于a+c个位等于3,十位等于1,所以a+c = 13,所以b+b = 2。

4,有一组数,求这组数的最大数和最小数的绝对值是多少?
private static void f4()
    {
        int[] arr = new int[] { 4, 6, 9, 52, 36, 97, -63, -55, -1, 64, -36 };
        int len = arr.length;
        int max = 0;
        int min = 0;
        for (int i = 0; i < len; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
            }
            if (arr[i] < min)
            {
                min = arr[i];
            }
        }
        System.out.println(Math.abs(max - min));
    }
5,打印九九乘方表
private static void f5()
    {
        for (int i = 1; i <= 9; i++)
        {
            for (int j = 1; j <= i; j++)
            {
                System.out.printf("%2dx%2d=%2d ", j, i, i * j);
            }
            System.out.println("");
        }
    }
6,求两个字符串的交集,例如“iloveyou”和”ihateyou”输出”eyou”
private static String strAnd(String str1, String str2)
    {
        String base = null;
        String match = null;
        if (str1.length() < str2.length())
        {
            match = str1;
            base = str2;
        }
        else
        {
            match = str2;
            base = str1;
        }
        int start = -1;
        int end = -1;
        String ret = null;
        for (int i = 0; i < match.length(); i++)
        {
            char c = match.charAt(i);
            if (base.indexOf(c) >= 0)
            {
                start = i;
                break;
            }
        }
        for (int i = match.length() - 1; i >= start; i--)
        {
            char c = match.charAt(i);
            if (base.indexOf(c) >= 0)
            {
                end = i;
                break;
            }
        }
        ret = match.substring(start, end + 1);
        if (base.indexOf(ret) >= 0)
        {
            return ret;
        }
        else
        {
            return strAnd(ret.substring(1), base);
        }
    }
点赞