58同城:
题目:现有1000瓶葡萄酒,只知道其中有一瓶是毒酒,但不知道是哪瓶,喝一点点毒酒,就会在一周之内发病死亡。试用最少的老鼠在一周时间试出哪瓶酒有毒。
Solution:
1、编号:
给葡萄酒标上数字:1-1000;给老鼠标上:0-9; 相应给杯标上:0-9; 每只老鼠配一只相同编号的杯子。
2、分酒:(根据2进制)
编号为1的葡萄酒分给编号为以下的杯子:0 (2^0 = 1)
编号为2的葡萄酒分给编号为以下的杯子:1 (2^1 = 2)
编号为3的葡萄酒分给编号为以下的杯子:1、0 (2^0 + 2^1 = 3)
。。。。
编号为1000的葡萄酒分给编号为以下的杯子:9、8、7、6、5、2、1、0(2^9 + 2^8 + 2^7 + 2^6 + 2^5 + 2^2 + 2^1 + 2^0 = 1000)
3、试酒:
让老鼠喝下相同编号的杯子。
4、找毒酒:
找出死掉的老鼠,记下其编号X、Y、Z……。
毒酒应该是编号为:2^X + 2^Y + 2^Z + ……
(转自:http://blog.csdn.net/juiceda/article/details/7514939)
2.全排列
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="abc";
char arr[]= str.toCharArray();
Permutation p=new Permutation();
p.m_permutation(arr, 0);
}
void m_permutation(char[] arr,int start)
{
if(start>=arr.length-1)
System.out.println(arr);
else
{
for(int i=start;i<arr.length;i++)
{
swap(arr,start,i);
m_permutation(arr, start+1);
swap(arr,start,i);
}
}
}
void swap(char []arr,int i,int j)
{
char temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
3.三维数组
题目:arr[a][b][c],起始地址m,单元空间是n,求arr[x][y][z]地址。
m+n*(x*b*c+y*c+z)。
4.相隔朋友数
有person m[]数组,存储不同的人;其中,person类包含个人的id,以及他的朋友数组person friends[].求m数组中某两个人的相隔的最少朋友数N,A和B是朋友,则N=0。
遍历m[],建立一个无向图,使是直接朋友的元素相连,再求每对顶点间的最短路径即可。其中,因为边的权值非负,可以使用Dijkstra算法(复杂度:O(N^2).),当然也可以使用Floyd-Warshall算法(复杂度:O(N^3).)。