把一个数组里的数组合全部列出了 比如1 2 列出来为 1, 2 ,12,21,
利用递归函数进行数组的全排列。
算法思想:
每次确定一个元素作为排列的第一个元素,然后对剩下的元素进行全排列并与已确定元素构成整个数组的全排列。
在不考虑效率,重复的前提下
public static void main(String[] args) throws Exception {
String[] array = new String[] {
"1", "2", "3", "4"
};
listAll(Arrays.asList(array), "");
}
public static void listAll(List candidate, String prefix) {
if (candidate == null || candidate.isEmpty()) {
System.out.println(prefix);
}
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);
listAll(temp, prefix + temp.remove(i));
}
}
=====输出=====
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
如果个数不固定,比如lz 1,2 ==> 1,2,12,21
public static void main(String[] args) throws Exception {
String[] array = new String[] {
"1", "2", "3", "4"
};
listAll(Arrays.asList(array), "");
}
public static void listAll(List candidate, String prefix) {
// if (candidate.isEmpty()) {
System.out.println(prefix);
// }
for (int i = 0; i < candidate.size(); i++) {
List temp = new LinkedList(candidate);
listAll(temp, prefix + temp.remove(i));
}
}
=====输出=====
1
12
123
1234
124
1243
13
132
1324
134
1342
14
142
1423
143
1432
2
21
213
2134
214
2143
23
231
2314
234
2341
24
241
2413
243
2431
3
31
312
3124
314
3142
32
321
3214
324
3241
34
341
3412
342
3421
4
41
412
4123
413
4132
42
421
4213
423
4231
43
431
4312
432
4321
先判断数组的元素是否有重复(即相等)?
有重复->递归+组合
无重复->递归+排列
暂时先讨论无重复的情况,数组的元素看作是一个集合,假设为n个,则
1): 取一个元素的情况,有n种可能性;
2): 取两个元素的情况,则有n*(n-1)/2种可能性,而取得的两个数又可以进行全排列,所以共有2!*n*(n-1)/2=n*(n-1)种可能性;
......
n-1): 取n-1个元素的情况,有n种可能性,而取得的n-1个数又可以进行全排列,所以共有n*(n-1)!=n!;
n): 取n个元素的情况,有1种,一个全排列,共有n!种;
所有的可能性为从第1)步到第n)步的可能性之和。
编程用递归也不容易,数组元素如果有重复,那就要用到《组合数学》中的定理了。限于时间,不再赘述。
排列
Pn(m)
首先去掉相同的数,然后根据排列的公式算出所有的排列,去掉位数2位以上的数的各个位上的数字都在1位数的数字集合里都出现过,
最后就是剩下的数组为A,元素个数为N,最后在根据排列公式算出所有的可能!
Pn(1)=n!/(n-1)!
Pn(2)=n!/(n-2)!
Pn(3)=n!/(n-3)!
...
Pn(n)=n!/(n-n)! (n是数组中有多少个不同的数)
一个简单的面试题,求最简单效率最快的方法.
4行3列的数组 求个行的和,各列的和,全部数组的总和.要代码最少方法效率最高
int[][] array = new int[][] ......; 3 * 4;
int[] rowSum = new int[array.length];
int[] colSum = new int[array[0].length];
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
rowSum[i] += array[i][j];
colSum[j] += array[i][j];
sum += array[i][j];
}
}
System.out.println("各行的和,各列的和,总和");
System.out.println("总和:" + sum);
System.out.println("第" + (i + 1) + "行的和:" + rowSum[i]);
int[][] array = new int[][] {
{2, 9, 4},
{7, 5, 3},
{6, 1, 8}
};
int[] rowSum = new int[array.length];
int[] colSum = new int[array[0].length];
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length; j++) {
rowSum[i] += array[i][j];
colSum[j] += array[i][j];
}
sum += rowSum[i];
System.out.println("第" + (i + 1) + "行的和:" + rowSum[i]);
}
for (int i = 0; i < colSum.length; i++) {
System.out.println("第" + (i + 1) + "列的和:" + colSum[i]);
}
System.out.println("总和:" + sum);
}
public class countWords {
public static void main(String[] args) {
int[][] test={{1,2,3},{2,3,4},{2,4,5},{6,7,8}};
int[] rowCount=new int[4],hcount=new int[3];
for(int i=0;i<4;i++){
int[]part=test[i];
for(int j=0;j<part.length;j++){
rowCount[i]+=part[j];
hcount[j]+=part[j];
}
}
int allCount=0;
for(int i=0;i<rowCount.length;i++){
System.out.println("第"+(i+1)+"行"+" "+rowCount[i]);
allCount+=rowCount[i];
}
System.out.println("总和为 "+allCount);
for(int i=0;i<hcount.length;i++){
System.out.println("第"+(i+1)+"列"+" "+hcount[i]);
}
}
}
int a[4][3];
int line[4];
int col[3];
int sum;
for(int i=0;i<4;i++)
{
line[i]=a[i][1]+a[i][2]+a[i][3];
}
for(int j=0;j<3;j++)
{
col[i]=a[0][j]+a[1][j]+a[2][j]+a[3][j];
}
sum = col[0]+col[1]+col[2];
public class MultiArray
{
public static void main(String[] args)
{
int[][] array=new int[][]{
{1,2,5},
{1,3,34},
{4,6,2},
{3,4,1}};
System.out.println(array.length);
System.out.println(array[0].length);
int sum=0;
int rowSum=0;
int colSum=0;
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
rowSum+=array[i][j];
}
System.out.println("rowSum= "+rowSum+" 行数: "+i);
sum+=rowSum;
rowSum=0;
}
System.out.println("总和: "+sum);
for(int i=0;i<array[0].length;i++)
{
for(int j=0;j<array.length;j++)
{
colSum+=array[j][i];
}
System.out.println("colSum= "+colSum+" 列数:"+i);
colSum=0;
}
}
}
一道微软面试题(和单链表有关)
如何判断一个单链表是否存在循环(尾元素指针不指向NULL,而指向链表某一元素),链表数目未知。
算法不能破坏链表
Element * p=input;
TODO:
if(Hash.Contains(p) return true;
if(p==NULL) return falsee;
Hash.AddElementAddress(p);
p=p->next;
goto TODO;
两个指针,一个步长为1,一个步长为2,让它们同时出发,如果存在循环,它们两个一定能再O(n)的时间内碰到
两个指针,一个步长为1,一个步长为2,让它们同时出发,如果存在循环,它们两个一定能再O(n)的时间内碰到
为什么?能否详细道来?有数学知识在里面吗?
面试题(IT人必读)
基本题型:
1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?(最短时间)
2.你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟)
3.如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?(40秒-3分钟)
4.一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人。请问应该怎么问?(20秒-2分钟)
5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时)
6.在9个点上画10条直线,要求每条直线上至少有三个点?(3分钟-20分钟)
7.在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?(5分钟-15分钟)
据说是微软的以前的一部分考题,这是基本题型。各位同仁,知道一个回答一个哦!
1.从两头一起点,燃完为止
2.4个
3.3+3-5=1 1+3=4
4.直截回其中一个1+1等于几,回答2的就诚实国的人,否则是说慌国的人
5.证明过程相当复杂,片副有限暂略
6. .
烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?(最短时间)
回答:先在一头烧半个小时的绳子,然后再点两头,这样烧完正好是十五分钟
同时点两根A和B,A点一头,B两头点,当B燃完时,马上把A搞灭,A剩下的再两头点就是15分钟间,
12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时)
回答:第一次两边各放六个球,取出不同的一边,
第二次两边各放三个,再取
第三次取两个球
第一题:1.取3条绳子a,b,c;
2.将a绳从一端点燃,b绳从两端点燃,两绳三端同时燃起,开始计时;
3.b绳燃完瞬间将a绳另一端点燃;
4.a绳燃完瞬间取c绳将其两端同时燃起;
5.c绳燃完则计时完毕,为1小时15分.
第二题:4个
第三题:记3公升的桶为瓢,记5公升的桶为桶.用瓢分两次"满瓢"水将桶灌满水.则瓢中剩水为
1升, 再将桶中水倒干,将此时瓢中所剩水灌入桶中,再盛满瓢水灌入桶中,此时桶中
水即为4升.
第四题:说假话的人记为甲,说真话的人记为乙.你问甲:"如果我问乙那我该选那条路去说谎国,
他会说什么",将甲的答案取反既为正确答案.当然你也可以向乙问同样的问题,将他的
回答取反就是正确答案.原理:1&0=0,0&1=0(1代表真,0代表假)
第五题:判定树算法即可解决.
第七题:中午12点整和晚上0点整.因为秒的一跳是一刻度(表有60个刻度),要使秒针和分针重叠,
则分针必须在刻度上.而分针在刻度上时,秒针肯定在刻度0的位置(即12点的位置),所以
只有秒针和分针都在刻度0的位置上才满足这样的条件,所以有且只有时针,分针,秒针都
在刻度0的位置上才能满足题目要求.
5.12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时)
第一题:两根香同时点燃,第一根两头都点,第二根只点一头,第一根香烧完时刚好30分钟,再把第二根香的另一头也点燃,待第二根香也完全烧完时正好又过了15分钟,加在一起是45分钟。
第二题:4个。
第三题:先将3公升的提桶注满水,然后将3公升的接满倒入5公升提桶里,然后在将3公升提桶注满水倒入5公升桶里,这时,3公升提桶中还有1公升水,将5公升提桶中水倒掉,将3公升提桶中的一公升倒入5公升提桶,将3公升提桶注满水倒入5公升提桶中,此时,5公升提桶中有4公升水。
第四题:问其中一人:另外一个人会说哪一条路是通往诚实国的?回答者所指的那条路必然是通往说谎国的。
第五题:第一次:4,4 如果平了:
那么剩下的球中取3放左边,取3个好球放右边,称:
如果左边重,那么取两个球称一下,哪个重哪个是次品,平的话第三个重,是次品,轻的话同理
如果平了,那么剩下一个次品,还可根据需要称出次品比正品轻或者重
如果不平:
那么不妨设左边重右边轻,为了便于说明,将左边4颗称为重球,右边4颗称为轻球,剩下4颗称为好球
取重球2颗,轻球2颗放在左侧,右侧放3颗好球和一颗轻球
如果左边重
称那两颗重球,重的一个次品,平的话右边轻球次品
如果右边重
称左边两颗轻球,轻的一个次品
如果平
称剩下两颗重球,重的一个次品,平的话剩下那颗轻球次品
13个球:
第一次:4,4,如果平了
剩5颗球用上面的方法仍旧能找出次品,只是不能知道次品是重是轻
如果不平,同上
第六题:见下面的点 10条线的情况是 123 456 789 148 159 247 258 269 357 368
① ② ③
④⑤⑥
⑦ ⑧ ⑨
第七题:从开0:0:0到闭12:0:0,时针分针重合的时刻约为:1:5:27,2:10:54,3:16:21,4:21:49,5:27:16,6:32:43,7:38:10,8:43:38,9:49:5,10:54:32,12:0:0;角度x约为32.7,65.5,98.2,130.9,163.6,196.4,229.1,261.8,294.5,327.3,360 对应的秒针角度s约为163.6,327.3,130.9,294.5,98.2,261.8,65.5,229.1,32.7,196.4,360 可见只有三针同为360度时,也即12:0:0时重合。
很明显,1:05之后有一次,2:10之后有一次,3:15之后有一次,4:20之后有一次,5:25之后有一次,6:30之后有一次,7:35之后有一次,8:40之后有一次,9:45之后有一次,10:50之后有一次,12:00整有一次。24小时之中总共22次。而且,相邻两次重合之间所需时间相同,即12/11小时。准确说都分别是0点,12/11点,24/11点,36/11点,48/11点,60/11点,72/11点,84/11点,96/11点,108/11点,120/11点,12点,144/11点,156/11点,168/11点,180/11点,192/11点,204/11点,216/11点,228/11点,240/11点,252/11点。 有趣的是这11个点,正好是圆内接正11边形,其中一个顶点在12点处。
3137

被折叠的 条评论
为什么被折叠?



