摘要
遇见面试题不要慌,能秒就秒,秒不掉可以从这三个方面入手:画图、举例、分解
对称的二叉树、顺时针打印矩阵、栈的压入弹出序列、分行打印二叉树、之字形打印、二叉树中和为某一值、复杂链表的复制、序列化二叉树、字符串排列
李彦宏喜欢让人证明
画图
1.对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
书上思路:
只要遍历中左右==中右左(考虑null)这颗二叉树就是对称的
自己的思路:
写一个方法fun(TreeNode t1,TreeNode t2),用来判断t1是否和t2对称
判断过程中不断递归即可(t1.left应该和t2.right对称)
2.顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
这道题虽然结果看起来是螺旋着向内,但是其实完全没有必要考虑螺旋
就是一圈一圈的打印就好了,打印完最外圈,向内走一步
举例
3.栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
public boolean validateStackSequences(int[] pushed, int[] popped) {
//pushed是入栈序列,poped是出栈序列
}
第一次做的时候,是用了一个辅助栈,和一个索引i,表示pushed的前i个元素要么已经打印
要么在辅助栈中,如果下一个要匹配的元素(poped[j])等于pushed[i]或者辅助栈顶
就匹配成功,然后j++
其实这个思路是很混乱的,因为他的出口有两个(就是触发j++的情况有两种,要么pushed[i]==poped[j],要么stack.peek()==poped[j]),
如果能把出口函数改造成只要一个,思路就会很清晰,代码就会很简洁
这个题既然用了辅助栈,要把出口减成一个的话就肯定是stack.peek()==poped[j]
因为如果pushed[i]==poped[j]这个出口能解决所有的情况的话,也就不需要辅助栈了
但是很显然没有辅助栈,解决不掉这道题
所以以后写代码,尽量出口只有一个
4.分行打印二叉树
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
这题就是一个很简单的层序遍历,需要保留层次信息,我的惯用做法是队列中塞null
书中给的做法是,使用俩全局变量,一个存储本层还未打印的节点的数目,一个存储下一层的数目
e也能实现,但是感觉不如null好,主要是习惯了
5.之字形打印二叉树
就是之字形zigzag,从左到右,从右到左,从左到右…
这题很烦,我第一次做错了都不知道(因为是学长出题,没有提交)
第二次leetcode上刷,二刷还想了一会儿,而且突然想到之前的做法是错误的
所以再做一次吧(就按二刷思路就行)
6.二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。
这就是典型的回溯或者dfs模板题,不想多说
分解
7. 复杂链表的复制
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
思路一:O(n^2)
最普通的思路,先遍历一次把next指针部署好,(因为random指向的可能是没
创建的节点,所以不能一次也把random部署好),然后再对每一个random的节点赋值,
寻找random需要O(n),所以就是O(n^2)喽
思路二:
思路一主要是寻找random花费的时间长,如果我们用HashMap记录一下
Node和Node'不就好了,这样时间会是O(n),空间O(n)
思路三:
我们将新new出来的节点接到老节点后边形成这样的链表:
A->A'->B'->B'->C->C'->.....这样寻找random是不是就会快点呢?
8.序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
之前做过的,中序遍历和后续遍历生成树,对不对,但是这需要存两个序列,
我们呢可以在中间加上null值或者特殊的符号用来标记null,这样我们就可以
通过一个序列生成树
比如:[1,2,3,null,null,4,5],这个层序遍历,当然层序遍历就需要两个队列实现了
9.字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。
典型的回溯算法啊,全排列,swap
引申:8皇后用12345678初始化数组然后全排列快吗?
1776

被折叠的 条评论
为什么被折叠?



