美团网产品类笔试面试经验(2)

笔试面试2018-11-22李天扬老师

  编程1 实现二叉树每一个节点的左右子节点相互调换?

  参考程序:

  Status BiTree_Revolute(BiTree T)//左右子树交换

  {

  if(!T) return OK;

  BitNode *temp;

  if(T->lchild!=NULL&&T->rchild!=NULL)

  {

  temp=T->lchild;

  T->lchild=T->rchild;

  T->rchild=temp;

  }

  BiTree_Revolute(T->lchild);

  BiTree_Revolute(T->rchild);

  return OK;

  }

  编程2 一个台阶一共n级,一次可跳1级,也可跳2级,编程实现计算共有几种方法?并分析算法的时间复杂度

  思路:

  首先我们考虑最简单的情况:如果只有1 级台阶,那显然只有一种跳法,如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级;另外一种就是一次跳2 级。

  现在我们再来讨论一般情况:我们把n 级台阶时的跳法看成是n 的函数,记为f(n)。当n>2 时,第一次跳的时候就有两种不同的选择:一是第一次只跳1 级,此时跳法数目等于后面剩下的n-1 级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2 级,此时跳法数目等于后面剩下的n-2 级台阶的跳法数目,即为f(n-2)。

  因此n 级台阶时的不同跳法的总数f(n) = f(n-1) + f(n-2)。

  我们把上面的分析用一个公式总结如下:

  / 1 (n=1)

  f(n) = 2 (n=2)

  \ f(n-1) + (f-2) (n>2)

  分析到这里,相信很多人都能看出这就是我们熟悉的Fibonacci 序列。

  参考代码:

相关推荐

猜你喜欢

大家正在看

换一换