1. 最大公约数的求法:欧几里德算法
2. 一个楼梯有N级,现在一步可以走1阶、2阶和3阶,问上N级有多少中走法?
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];
}