论坛首页 招聘求职论坛

几道比较有深度的题

浏览 11984 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-09  
zhaozhongwei 写道
小学题好像被你算错了,如果5个人的话,按你的算法是4,我觉得5个人一个还是5


你再想一想,呵呵
0 请登录后投票
   发表时间:2008-10-09  
第四题

def calculate(x)
  count=empty=x
  loop do
    break if empty<5
    empty/=5
    count+=empty 
  end
  count
end

def hello(num)
  num.times do |x|
    break x+1 if num<=calculate(x+1)
  end
end

p hello(5)
0 请登录后投票
   发表时间:2008-10-09  
zjlovezj 写道
zhaozhongwei 写道
小学题好像被你算错了,如果5个人的话,按你的算法是4,我觉得5个人一个还是5


你再想一想,呵呵

怎么想,我还是觉得没想错,5个人买4瓶,你难道换的时候告诉人家我喝完了,把瓶给你,是这样吗?
0 请登录后投票
   发表时间:2008-10-09  
估计是我理解的有问题,呵呵,我一直觉得是你得有瓶子才能换,呵呵,我保持沉默了
0 请登录后投票
   发表时间:2008-10-09  
hyhongyong 写道


思路正确,但是细节没有注意到,第一个棋子隔n个,没坏时,下一次要隔n-1个,这样总次数不会超过n就能检查出来。 要保证n + n-1 + n-2 + ... + 1 >= 100



为什么下一次要隔n-1了(n-2或者其它不行吗),这其中有数学原理吧。
0 请登录后投票
   发表时间:2008-10-09  
HammeR 写道
hyhongyong 写道


思路正确,但是细节没有注意到,第一个棋子隔n个,没坏时,下一次要隔n-1个,这样总次数不会超过n就能检查出来。 要保证n + n-1 + n-2 + ... + 1 >= 100



为什么下一次要隔n-1了(n-2或者其它不行吗),这其中有数学原理吧。


这里是为了让第一个棋子的试验次数与第二个棋子的实验次数的和保持不变
0 请登录后投票
   发表时间:2008-10-09  
kaka2008 写道
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的问题是 从效率上考虑,争论了这么多,对不对且不说了,这个就是最有效率的?



假定数组长度为n
那么这个算法在数组中的数字顺序排列的时候,判断语句执行次数达到最小值n
在逆序排列的时候,判断语句执行次数达到最大值2n-1
可见这算法是效率是O[n]

请问,存在效率高于O[n]的算法么?

0 请登录后投票
   发表时间:2008-10-10  
第4题: 突然发现答案的规律了..

	public int count(int personNumber) {
		int result = -1;

		if (personNumber < 10) {
			// 自己手算吧

		} else {
			switch (personNumber % 5) {
				case 0:
					result = personNumber - (personNumber / 5) + 1;
					break;
				default: // 1, 2, 3, 4
					result = personNumber - (personNumber / 5);
					break;
			}
		}
		return result;
	}


10以下: 没有规律.
10以上: 结果是有规律的. 看代码.
0 请登录后投票
   发表时间:2009-05-31  
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


不好意思,翻了个老帖子

每次最大值变量被替换前的值保留下来,就是第二大的

如果后面某个值比最大值小,比第二最大值大,就会出错

再次,这种程序要注意最大值和第二最大值的初始化,使用数组的前两个元素比较大小后来初始化最大值和第二最大值比较好

02年计算机等级考试四级的上机题我们都得了满分,可是我们的算法有个明显的逻辑错误,跟这个类似


0 请登录后投票
论坛首页 招聘求职版

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