1、重建二叉树
题目的要求是根据提供的前序遍历和中序遍历来重建一棵二叉树
解题思路:自定义一个重建函数,主函数在设定好范围后,调用即可。重建函数的想法是,首先根据输入的先序的范围进行判断,如果先序遍历范围的左边大于右边,则直接返回NULL。首先根据先序遍历的数组获得根结点的值,然后重建根结点。再根据根结点的值在中序遍历中的位置,获得左子树和右子树的数据范围。然后递归的重建左子树和右子树即可。这里一定要注意重建左子树和右子树的范围,根据样例计算一下count。重建完成后,返回root。
2、用两个栈实现队列。
题目的要求是设计两个栈实现队列的功能,也就是在队列尾部进行插入操作,在队列头部进行删除操作。
首先需要明确的是,队列是一种先进先出的线性结构,也就是说插入操作在队尾进行,删除操作在队列头部进行。
那么可以知道的是,如果是插入操作,则直接push即可。但是要删除怎么办呢?那就涉及到两个栈的分工了——左边的栈负责数据的接受,右边的栈负责数据的删除。也就是说,如果插入,直接插入左边栈的栈顶,如果要删除左边的栈底元素,则将左边栈的元素,按顺序出左栈入右栈,如果右边栈不为空,然后删除右栈的栈顶元素,再按顺序出右栈入左栈。最后返回删除的元素即可(如果右边栈为空,则返回删除的元素为-1)。
3、斐波那契数列
常规的写法是典型的递归写法,但是会超出时间限制。为什么会超出时间限制?是因为每一次的递归都会重复计算好多已经计算过的内容。所以考虑将已经计算过的内容拿数组存起来,减少运算时间。
首先初始化一个值全为0的数组(主函数外定义),然后将数组的第一位和第二位进行固定,然后从第三位开始循环计算。最后返回最后一位即可。
4、青蛙跳台阶问题
这是一个斐波那契数列的变种题,根据给定的条件进行一定的推算就能想到斐波那契数列。
可以根据上面提到的数组的写法来完成,但是此时要注意,数组的第一位和第二位都是1(根据题意改变)。也可以利用多个参数进行递推。
要注意计算过后,赋值的问题。c计算完成后的核心赋值为a = b; b = c;最终一定要返回我们计算完成的c的数值。
注意3和4都需要根据题意来进行取模操作。(取模其实内核就是取余)