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);
        }
    }
点赞
  1. hjx说道:

    第四个程序题目要求的是求这组数的最大数和最小数的绝对值是多少?但是给出的程序求的是最大值和最小值的差的绝对值吧!!!

发表评论

电子邮件地址不会被公开。 必填项已用*标注