剑指Offer复盘(七)——面试中的各项能力
面试中的能力
写了一半了,不小心退出了。md难受心累,不想写了。
面试题53
二分查找区间的左右端点。有时需要利用索引和储存元素的关系设计二分方法。
面试题54
BST第k大,进行中序遍历即可。
面试题55
二叉树的深度,递归求解即可。求平衡二叉树需要注意一下,利用后序遍历可以减少重复访问树节点的代价。
面试题56
数组中数字出现次数。异或运算,位运算的使用只能背下来。
面试题57
和为s的数字,由于原数组排序,因此可以使用双指针两端查找的办法进行。题目的延伸将两个数字修改为连续的一个区间,并且需要输出所有这些符合要求的区间。直觉上应该是一个滑动窗口的题目。套模版双while循环。
面试题58
反转字符串。需要注意的是仅反转单词顺序,不反转单个单词。因此可以考虑使用stringstream来处理整个字符串,先读取单个单词,之后连接起来。如果不这样做,按照书中的方法,可以先把整个字符串全部反转,之后使用扫描空格的方法再区分每个单词,把每个单词转回去。
题目的延伸是对字符串左旋转。可以利用之前的思路,把两部分各自反转,之后整体反转,考察了问题迁移的能力。
面试题59
队列最大值,单调队列标准题目。需要注意的是要用deque双端队列容器实现(保持单调性的操作需要pop_back,队头最大值出队需要pop_front)。
面试题60
从本题开始,主要讲的是抽象思维/发散思维能力,其实与算法基础知识和时间复杂度优化等内容的关系不是太大,主要考察的是如何选取数据结构/算法/递归形式描述建模问题,一旦找到了这个对应关系,求解就相对容易,否则的话不太好想。
本题主要是解决扔骰子的结果问题,可以按照dp创建数组的思路,逐层算条件概率。最后一层就是要的答案。
面试题61
扑克牌的顺子,首先要充分理解这个概念,顺子的概念显然和连续的有序数据有关。之后想到利用排序使得数据有序,然后处理特殊情况:大、小王可以补充作为任何一个数字
面试题62
约瑟夫环问题,非常经典的数据结构题目。使用链表模拟和使用递推形式求解都应该记住。
面试题63
股票利润问题,暴力的做法为O(n^2),可以采取记录出现的最小值的方法,使得一次遍历得到最终结果。
面试题64
不用XXX操作求等比数列,可以采用创建数据结构,然后计算占用字节数的方法。
面试题65
不用加减乘除做加法,可以使用位运算处理进位。用与运算&检查是否出现进位,用异或运算完成求和,需要用一个while循环处理,直到不再出现进位的情况。
面试题66
构造乘积数组,不能使用除法。显然暴力计算结果为O(n^2),可以考虑乘积数组中每个元素之间的对应关系,每个元素可以分成两部分(i之前,i之后),每部分都是利用上一部分作乘法推导出来的。然后问题就解决了,这也算是空间换时间的思想的应用。

浙公网安备 33010602011771号