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

来源:互联网 发布:macbook pro 删除软件 编辑:程序博客网 时间:2024/05/02 03:34
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];}


原创粉丝点击