《剑指offer》刷题打卡第4天

算法和数据操作:
算法考查:排序和查找是算法考查的重点。二分查找、归并排序和快速排序。
如果我们需要重复的多次计算相同的问题,则通常可以选择用递归或者循环两种不同的方法。
递归是在一个函数的内部调用这个函数自身。而循环则是通过设置计算的初始值及终止条件,在一个范围内重复运算。
比如求1+2+…+n
用递归实现:

int AddFrom1ToN_Recursive(int n)
{
Return n<=0?0:n+AddFrom1ToN_Recursive(n-1);
}

用循环实现:

int AddFrom1ToN_Iterative(int n)
{
 int result = 0;
 for(int i=1;i<=n;++i)
result +=i;
return result;
}

递归的优点:代码简洁
缺点: 递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈里压入数据和弹出数据都需要时间。
另外,递归中有可能很多计算都是重复的,从而对性能带来很大的负面影响。

面试题7:
要求输入一个整数n,输出斐波那契数列的第n项(从0开始,第0项为0)。

斐波那契定义如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实现代码:

long long Fibonacci(unsigned n)
{
 int result[2]={0,1};
 if(n<2)
 return result[n];

long long fibNMinusOne = 1;
long long fibNMinusTwo = 0;
long long fibN = 0;

for(unsigned int i=2;i<=n;++i)
{
 fibN=fibNMinusOne + fibNMinusTwo;
 
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;

}
return fibN; 

}

在这里插入图片描述
面试题8:
青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:
对于本题,前提只有一次1阶或者2阶的跳法。
首先讨论特殊情况:
我们把n级台阶时的跳法看出n的函数,记为f(n)。
如果只有1级台阶,只有1种跳法,即f(1)=1。
如果有2级台阶,那就有两种跳法:
一种是分两次跳,每次跳1级;
另一种就是一次跳2级。
即f(2)=2
接着讨论一般情况:
当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);
二是第一次跳2级,此时跳法数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。
因此,n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。
通过上述分析可以得出一个斐波那契数列:
f(n)=1(n=1) f(n)=2(n=2) f(n)=f(n-1)+f(n-2),(n>2,n为整数)
代码实现:

int JumpFloor(int target)
{
  if(target <= 0){
return -1;
}
else if(target == 1){
return 1;
}
else if(target == 2){
return 2;
} 
else 
return;
int targetOne = 2;
int targetTwo = 1;
int targetSum = 0;
for(int i=3;i <= target;++i)
{
 targetSum =target0ne +targetTwo;
targetTwo = targetOne;
targetOne = targetSum;
}
return targetSum;
}

面试题9:
一只青蛙一次可以跳上1级台阶,也可以跳上2级… 它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

解题思路:
本题前提条件:n个台阶会有一次n阶的跳法。
分析如下:
f(1)=1
f(2)=f(2-1)+f(2-2)//f(2-1)表示2阶一次跳1阶的次数,f(2-2)表示2阶一次跳2阶的次数。
f(3)=f(3-1)+f(3-2)+f(3-3)

f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-(n-1))+f(n-n)

整理上式得:f(n)=f(n-1)+f(n-2)+…+f(n-(n-1))+f(n-n)
=f(0)+f(1)+f(2)+f(3)+…+f(n-2)+f(n-1)
又因为:
f(n-1)=f(0)+f(1)+f(2)+f(3)+…+f(n-2)+f((n-1)-1)=f(0)+f(1)+f(2)+f(3)+…+f(n-2)

所以:
f(n)=f(n-1)+f(n-1)=2*f(n-1)

综上所述:
在n阶台阶,一次有1、2、…n阶的跳的方式时,总得跳法为:
f(n)=0(n=0),f(n)=1(n=1),f(n)=2*f(n-1)(n>=2)

代码实现:

class Solution{
public:
int jumpFloorII(int number)
{
 int NumberOfSteps = 2;
if(number <= 0)
return -1;
if(number == 1||number == 2)
return number;
for(int i=3;i<=number;i++)
{
  NumberOfSteps *= 2;
}
return NumberOfSteps ;
}
}

猜你喜欢

转载自blog.csdn.net/tpf930726/article/details/88931302