剑指Offer复盘(三)——基础知识部分

基础知识

基础知识部分是书中的第2章2.3、2.4节,主要是关于数据结构和基础算法的使用。对应编号为面试题3-面试题15

面试题3

求解数组重复数字。最简单的思路直接哈希的话需要空间复杂度O(n),可以优化到O(1),核心思想是利用给出数组的位置下标记录了对应的数字,当比较的时候遇到了已经交换到对应位置上的元素,则说明该值重复,返回重复值。

面试题4

部分有序的二维数组中查找,发现每行、每列都有序,但是整体上看并不能保证上一行的结尾小于下一行的开头,观察可知,从对角线开始查找较为容易,因为存在类似BST的偏序关系。

面试题5

重做的时候想到了用stringstream读取每个单词,然后中间添加%20,但是没考虑到题目中说的每个空格都要处理而不是对多个空格合并进行处理,其实只需要用string接受就可以,按照原书的做法,可以提前把所需空间算出来,会节约一些时间。

面试题6

从尾到头打印链表,直接用栈可以比较容易表示,而递归调用本身就是栈,所以先递归,后打印即可正确输出。

面试题7

 重建二叉树,首先要熟悉前序遍历和中序遍历的性质,前序就是先输出根,再访问左右子树;中序就是访问左子树之后输出根,所以有了前、中序的结果就足够用于重建树(题目中说了不包含重复的数字),这个时候可以通过根的位置区分出左右子树,然后递归调用可以重建,base case就是只有一个节点无子树的情况。

面试题8

二叉树的中序遍历下一个节点,主要是熟悉二叉树结构,如果有右子树,就访问右子树最左节点;如果没有右子树,就需要向上找父节点:如果这个节点是父节点的左子树;下一步就访问父节点,要不然就继续向上回溯。

面试题9

两个栈实现队列和两个队列实现栈是一类经典问题。

在两个栈实现队列时,一个栈s1用于放队列尾部,另外一个栈s2用于队首数据出队,每当想要出队但是s2为空时,把s1中的数据依次出栈,再压入s2,s2中得到的就是按进队顺序的数据。在两个队列实现栈时,一个队列q1用于存放栈中数据,另外一个队列q2用于栈顶数据出栈时元素储存,每当想要出栈时,将q1中的数据依次出队再入队q2直到q1只剩下最后一个元素,这个元素就是栈顶元素。下次出栈时q1和q2交换功能。

面试题10

斐波那契数列,直接循环实现即可。书上还提到了时间复杂度为O(logn)的方法,但是感觉不太实用。

面试题11

这个题目挺好的。主要考察了二分查找的知识和特殊情况的处理,显然O(n)可以得到解,但是由于数据部分有序,因此应当考虑更快的方法,二分查找是自然的选择,但是由于没有target值,具体怎么划分需要仔细考虑一下:

  • 如果中间值大于左边,显然最小值出现在中间值右边到末尾的闭区间
  • 如果中间值小于左边,此时不能排除中间值是最小值的情况,因此把整个左边+中间值作为新区间
  • 如果中间值等于左边等于右边,此时比较麻烦,说明有重复值,需要单独处理进行线性查找

面试题12

标准DFS,貌似没有剪枝可做?

面试题13

标准DFS,统计连通顶点个数,貌似没有剪枝可做?

面试题14

题目的形式看起来是标准的一维数组上dp,两个小规模问题的答案组合产生一种选择,最优选择是大规模问题的解,但是题目比较特殊,可以用贪心的方法直接求解。

面试题15

位运算题目,只有记住。

猜你喜欢

转载自www.cnblogs.com/hesun/p/13377200.html