锁定老帖子 主题:几道比较有深度的题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-08
第4题:
package cn.iwoo; /** * 有N个人买可乐,每5空瓶送1瓶 问共需要买多少瓶? */ public class ChangingTest { private int count = 0; // 喝过的总数 private int empty = 0; // 剩下还没换的空瓶 /** * 换一次 */ private void changeOne() { count += empty / 5; empty = empty % 5; } /** * 交换到不能交换为止 */ private int changeAll(int initEmpty) { this.empty = initEmpty; this.count = initEmpty; while (empty >= 5) { this.changeOne(); } return count; } /** * 计算需要购买的瓶数 * @param number 总人数 */ public int countNeedBuyNumber(int number) { // 穷举到底需要买几瓶可以买满number数. int i = 1; boolean isOk = false; while (!isOk) { int total = this.changeAll(i); if (total >= number) { isOk = true; break; } else { i++; // ++再穷举 } } return i; } public static void main(String[] args) throws Exception { ChangingTest test = new ChangingTest(); assertEqual(test.countNeedBuyNumber(4), 4); // 4个人买4瓶 assertEqual(test.countNeedBuyNumber(5), 5); // 5个人买5瓶 assertEqual(test.countNeedBuyNumber(12), 10); // 12个人买10瓶 } /** * 由于不想用JUnit, 特地写的一个用于断言的方法. */ public static void assertEqual(int actual, int expected) throws Exception { if (actual != expected) { throw new NullPointerException("预计值:[" + expected + "]与实际值:[" + actual + "]不等!"); } } } |
|
返回顶楼 | |
发表时间:2008-10-08
armorking 写道 chenpingtai2008 写道 2。求一组数中第二大的元素,要求从效率上考虑。 线性查找求最大值 每次最大值变量被替换前的值保留下来,就是第二大的 public class Test2ndMax { public static void main(String[] args) { int[] intArray = new int[] { 1, -5, 20, 14, 56, 67, 23, 99, 188, 87, 290, 34, 144, 250, 400 }; System.out.println("the second max integer is : " + search2ndMax(intArray)); } public static int search2ndMax(int[] intArray) { if (intArray == null || intArray.length <= 1 ){ throw new IllegalArgumentException(); } int result = intArray[0]; int max = intArray[0]; //最大值变量 for (int i = 1 ; i < intArray.length ; i++) { if (intArray[i] > max ){ result = max; max = intArray[i]; } } return result; } } 引用 the second max integer is : 290 没看后面留言。 刚看代码就有点小问题。 如果数组第一个数字是最大的,那计算的出来的必然是第一个数字。 |
|
返回顶楼 | |
发表时间:2008-10-08
第4题
构造一个一颗满5叉树,只要这个树的所有节点数刚好大于或等于N,那么这个数的叶子节点点数就是我们结果。 假设这个数有x层,那么节点总数(5^(x+1)-1)/4。 叶子节点数为5^x (5^(x+1)-1)/4 >=N 得 5^x >= (4*N+1)/5 |
|
返回顶楼 | |
发表时间:2008-10-08
kaka2008 写道 armorking 写道 chenpingtai2008 写道 2。求一组数中第二大的元素,要求从效率上考虑。 线性查找求最大值 每次最大值变量被替换前的值保留下来,就是第二大的 public class Test2ndMax { public static void main(String[] args) { int[] intArray = new int[] { 1, -5, 20, 14, 56, 67, 23, 99, 188, 87, 290, 34, 144, 250, 400 }; System.out.println("the second max integer is : " + search2ndMax(intArray)); } public static int search2ndMax(int[] intArray) { if (intArray == null || intArray.length <= 1 ){ throw new IllegalArgumentException(); } int result = intArray[0]; int max = intArray[0]; //最大值变量 for (int i = 1 ; i < intArray.length ; i++) { if (intArray[i] > max ){ result = max; max = intArray[i]; } } return result; } } 引用 the second max integer is : 290 没看后面留言。 刚看代码就有点小问题。 如果数组第一个数字是最大的,那计算的出来的必然是第一个数字。 调用int search2ndMax(int[] )函数前先对intArray[]数组做下判断:if intArray[0]>intArray[1] {int temp=intArray[0];intArray[0]=intArray[1];intArray[1]=temp;}这样就不会了,时间复杂度也没变 |
|
返回顶楼 | |
发表时间:2008-10-08
java-shaw 写道 kaka2008 写道 armorking 写道 chenpingtai2008 写道 2。求一组数中第二大的元素,要求从效率上考虑。 线性查找求最大值 每次最大值变量被替换前的值保留下来,就是第二大的 public class Test2ndMax { public static void main(String[] args) { int[] intArray = new int[] { 1, -5, 20, 14, 56, 67, 23, 99, 188, 87, 290, 34, 144, 250, 400 }; System.out.println("the second max integer is : " + search2ndMax(intArray)); } public static int search2ndMax(int[] intArray) { if (intArray == null || intArray.length <= 1 ){ throw new IllegalArgumentException(); } int result = intArray[0]; int max = intArray[0]; //最大值变量 for (int i = 1 ; i < intArray.length ; i++) { if (intArray[i] > max ){ result = max; max = intArray[i]; } } return result; } } 引用 the second max integer is : 290 没看后面留言。 刚看代码就有点小问题。 如果数组第一个数字是最大的,那计算的出来的必然是第一个数字。 调用int search2ndMax(int[] )函数前先对intArray[]数组做下判断:if intArray[0]>intArray[1] {int temp=intArray[0];intArray[0]=intArray[1];intArray[1]=temp;}这样就不会了,时间复杂度也没变 你确定这样就行吗? 假如数组是 把最大的放第一个位置,最小的放第二位置,首先交换,执行程序后,max就变成了最大的值,以后也就不会继续循环喽! |
|
返回顶楼 | |
发表时间:2008-10-08
我所说的只是解决
”如果数组第一个数字是最大的,那计算的出来的必然是第一个数字“ 至于楼上的,上面已经有人给出了好办法: for (int i = 1 ; i < intArray.length ; i++) { if (intArray[i] > max ){ result = max; max = intArray[i]; continue; } if (intArray[i] > result ){ result = intArray[i]; } } |
|
返回顶楼 | |
发表时间:2008-10-08
etongg 写道 第4题
构造一个一颗满5叉树,只要这个树的所有节点数刚好大于或等于N,那么这个数的叶子节点点数就是我们结果。 假设这个数有x层,那么节点总数(5^(x+1)-1)/4。 叶子节点数为5^x (5^(x+1)-1)/4 >=N 得 5^x >= (4*N+1)/5 小学题~~ 可乐价值x,空瓶价值y 由“每5空瓶送1瓶”得 5y=x+y 空瓶是可乐价值的1/4 共需买z瓶 由“N个人要喝可乐(x)”得 z(x+y) >= N * x 最后得 z >= 4N/5 |
|
返回顶楼 | |
发表时间:2008-10-08
小学题好像被你算错了,如果5个人的话,按你的算法是4,我觉得5个人一个还是5
|
|
返回顶楼 | |
发表时间:2008-10-09
java-shaw 写道 我所说的只是解决
”如果数组第一个数字是最大的,那计算的出来的必然是第一个数字“ 至于楼上的,上面已经有人给出了好办法: for (int i = 1 ; i < intArray.length ; i++) { if (intArray[i] > max ){ result = max; max = intArray[i]; continue; } if (intArray[i] > result ){ result = intArray[i]; } } 还是不行。 暂且不争论这个了。 lz的问题是 从效率上考虑,争论了这么多,对不对且不说了,这个就是最有效率的? |
|
返回顶楼 | |
发表时间:2008-10-09
感觉还是从大到小排序 再选第二个就好了
Integer[] aa={11,22,44,55,32,54,3,2,5,23}; int tmp=aa[0]; for(int i=0;i<aa.length;i++){ for(int j=i+1;j<aa.length;j++){ if(aa[j]>aa[i]){ tmp=aa[j]; aa[j]=aa[i]; aa[i]=tmp; } } } System.out.println(aa[1]); } |
|
返回顶楼 | |