58同城:
1.10隻老鼠10隻杯檢測1000瓶酒中的毒酒。
題目:現有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 stubString 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).)。