2012-9-29 大众点评网笔试题

1. 最大公约数的求法:欧几里德算法
int function(int m, int n)
{
	if(m % n ==0)
		return n;
	return function(n, m % n);
}

2. 一个楼梯有N级,现在一步可以走1阶、2阶和3阶,问上N级有多少中走法?

这一题在网上有很多,只不过网上给出的没有3阶的走法,不过思路都是一样的,都是斐波纳契数列的一个变种而已。当上N阶阶梯时,可以直接从N-3级直接上3阶,可以从N-2级直接上2阶,也可以从N-1级直接上一级(注意,如果从N-3级先上一阶,然后再上2阶,则跟从N-2阶的情况重复了,其他情况类似),故可得知f(n)=f(n-1)+f(n-2)+f(n-3)。从题中可以轻易的得出f(1)=1, f(2)=2, f(3)=4. 具体的代码如下所示:

int calstepNumbers(int number)
{
	int a[] = {1,2,4,0};
	if(number <= 0) 
		return 0;
	if(number <  4) 
		return a[number];
	return calstepNumbers(number-1) + 
		calstepNumbers(number-2) + 
		calstepNumbers(number-3);
}

int calstepNumbers(int number) //非递归算法,运算时间比递归速度快,因为递归运算会存在很多重复计算
{
	int a[] = {1,2,4,0};
	if(number <= 0) 
		return 0;
	if(number <  4) 
		return a[number];
	for(int i = 4; i <= number; i++)
	{
		a[3] = a[0] + a[1] + a[2];
		a[0] = a[1];
		a[1] = a[2];
		a[2] = a[3];
	}
	return a[3];
}

3. 有一个整数数组长度为n,其中某个整数m的个数超过了该数组长度的一半,请找出该数字?要求算法时间为O(n).

整数m的个数超过了数组长度的一半,每次删除两个不同整数后,m的个数也会超过剩余数组个数的一半,因此只要不断继续这个过程,最终剩下的数肯定m,具体代码如下所示:

int findWaterPoster(int* array, int size)
{
    int times = 0, poster = 0;
    for(int i = 0; i < size; i++)
    {
        if(times == 0)
            poster = i;
        if(array[i] == array[poster])
            times++;
        else times--;

    }
    return array[poster];
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值