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);
}
}