论坛首页 招聘求职论坛

几道比较有深度的题

浏览 11983 次
精华帖 (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 + "]不等!");
		}
	}
}
0 请登录后投票
   发表时间: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


没看后面留言。

刚看代码就有点小问题。

如果数组第一个数字是最大的,那计算的出来的必然是第一个数字。
0 请登录后投票
   发表时间: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

0 请登录后投票
   发表时间: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;}这样就不会了,时间复杂度也没变
0 请登录后投票
   发表时间: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就变成了最大的值,以后也就不会继续循环喽!
0 请登录后投票
   发表时间: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];  
            }  
        }  
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2008-10-08  
小学题好像被你算错了,如果5个人的话,按你的算法是4,我觉得5个人一个还是5
0 请登录后投票
   发表时间: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的问题是 从效率上考虑,争论了这么多,对不对且不说了,这个就是最有效率的?
0 请登录后投票
   发表时间: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]);
		}
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics