1.应聘者需熟练掌握链表队列哈希表等数据结构,以及它们的操作。链表二叉树相关的问题是很多面试官喜欢问的问题。
2.大部分公司都会注重考查查找排序等算法。应聘者可以在了解各种查找和排序算法的基础上,重点掌握二分查找归并排序快速排序(随时正确完整地写出代码),很多面试题只是这些算法的变体而已。如 面试题8“旋转数组的最小数字”和面试题38“数字在排序数组中出现的次数”的本质是考查二分查找;而面试题36“数组中的逆序对”实际上是考查归并排序。
少数对算法很重视的公司如google或百度,还会要求应聘者熟练掌握动态规划贪婪算法,如面试题31“连续子数组的最大和”即为动态规划。
3. 链表是面试中被提及最频繁的数据结构。链表的创建、插入结点、删除结点等操作只需20行左右的代码就能实现,其代码量比较适合面试。除了简单的单向链表经常被设计为面试题外(面试题5“从尾到头输出链表”,面试题13“在O(1)O(1) 时间删除单链表结点”,面试题15“链表中的倒数第k个结点”,面试题16“反转链表”,面试题17“合并两个排序的链表”,面试题37“两个链表的第一个公共结点”等)。
链表的其他形式也备受面试官青睐,如环形链表(面试题45“圆圈中最后剩下的数字”),双向链表(面试题27“二叉搜索树与双向链表”)和其他形式的链表(面试题26“复杂链表的复制”)。
4.关于
面试中提到的树,大部分都是二叉树。前序、中序、后序这3种遍历都有递归和循环两种不同的实现方法,应聘者应该对其了如指掌(随时正确完整地写出代码),很多面试官喜欢直接或间接考查遍历(面试题39“二叉树的深度”、面试题18“树的子结构”、面试题25“二叉树中和为某一值的路径”)的具体代码实现,面试题6“重建二叉树”、面试题24“二叉树的后序遍历序列”也是考查对遍历特点的理解。二叉树的层序优先遍历也有涉及,如面试题23“从上到下遍历二叉树”。
二叉树有很多特例,二叉搜索树就是其中之一。在二叉搜索树中,左子结点总是小于或等于根结点,而右子结点总是大于或等于根结点。我们可以在O(logn)O(logn) 时间内根据数值在二叉搜索树中找到一个结点。二叉搜索树面试很多,如面试题50“树中两个结点的最低公共祖先”、面试题27“二叉搜索树与双向链表”。
二叉树的另外两个特例是堆和红黑树。最大堆中根结点的值最大,最小堆中根结点的值最小。红黑树是把树中的结点定义为红、黑两种颜色,并通过规则确保从根结点到叶结点最长路径的长度不超过最短路径的两倍。C++的STL中,set、multiset、map和multimap等数据结构都是基于红黑树实现的。与堆和红黑树相关的面试题,如面试题30“求最小的k个数字”。
5. 队列
是一个非常常见的数据结构,如面试题22“栈的压入、弹出序列”,面试题21“包含min函数的栈”。
队列是另外一种重要的数据结构。如面试题23“从上到下遍历二叉树”,面试题7“用两个栈实现队列”
6. 查找排序
查找相对简单,不外乎顺序查找、二分查找、哈希表查找、二叉排序树查找二分查找代码应能信手拈来,相关题目如面试题8“旋转数组的最小数字”和面试题38“数字在排序数组中出现的次数”。哈希表和二叉排序树查找的重点在于考查对应的数据结构而不是算法,哈希表的最主要优点是我们利用它能够在O(1)O(1) 时间查找某一元素,是效率最高的查找方式,缺点是需要额外的空间实现哈希表,如面试题35“第一个只出现一次的字符”。与二叉排序树对应的数据结构是二叉搜索树,如面试题24“二叉搜索树的后序遍历序列”和面试题27“二叉搜索树与双向链表”。
排序相对复杂一些。面试官会经常要求应聘者比较插入排序冒泡排序归并排序快速排序等不同算法的优劣,一定要对各种排序算法的特点烂熟于胸,能够从额外空间消耗、平均时间复杂度和最差时间复杂度等方面比较它们的优缺点。快排算法的partition函数除了可以用在快速排序算法中,还可以用来实现在长度为n的数组中查找第k大的数字。如面试题29“数组中出现次数超过一半的数字”和面试题30“求最小的k个数字”。
7. 递归和循环
递归的代码通常比较简洁,同时也有显著的缺点。递归中的函数调用是有时间和空间消耗的:每一次函数调用都需要在内存栈中分配空间以保存参数、返回地址及临时变量,往栈里压入数据或弹出数据也都需要时间。关于递归与循环的性能区别,如面试题9“斐波那契数列”和面试题43“n个骰子的点数”。
8.位运算
位运算是把数字用二进制表示之后,对每一位上0或者1的运算,它是针对二进制数字的运算规律。只要掌握二进制的与、或、异或运算及左移、右移操作,就能解决相关的面试题。相关例题如:面试题10“二进制中1的个数”,面试题40“数组中只出现一次的数字”,面试题47“不用加减乘除做加法”。
9.数据结构算法
数据结构一直是面试官考查的重点。数组和字符串是两种最基本的数据结构;链表应该是面试题中使用频率最高的一种数据结构;如果面试官想加大难度,他很可能会选用树相关的题目;栈和递归调用密切相关,队列在图(包括树)的宽度优先遍历中需要用到。
算法是面试官喜欢考查的另一个重点。查找(特别是二分查找)和排序(特别是快速排序和归并排序)是面试中最经常考查的算法,一定要熟练掌握。另外,还要掌握分析时间复杂度的方法,理解即使是同一思路,基于循环和递归的不同实现他们的时间复杂度可能大不相同。
10.谈解决面试题的思路
画图让抽象问题形象化。当面试题涉及链表、二叉树等数据结构时,画几张草图,隐藏的规律就可能变得很直观。比如面试题19“二叉树的镜像”,我们画几张图就会发现,求树的镜像的过程其实就是在遍历树的同时交换非叶结点的左右子结点;面试题20“顺时针打印矩阵”,画图之后很容易发现可以把矩阵分解成若干个圆圈,从外向内打印每个圆圈,且很多人会在边界条件上犯错误,而多画几张示意图就很容易找到最后一圈退化的规律;面试题26“复杂链表的复制”,如果能画出每一步操作时的指针操作,写代码就会容易很多。
举例让抽象问题具体化。试着用一两个具体的例子模拟操作的过程,或许能找到规律。比如面试题22“栈的压入、弹出序列”,仔细分析一两个序列,一步一步模拟压入、弹出的操作;面试题24“二叉搜索树的后序遍历序列”也类似。
分解让复杂问题简单化。把大问题分解成若干个简单的小问题,然后逐个解决这些小问题,可能会容易很多。比如面试题26“复杂链表的复制”,将复杂链表复制的过程分解为三个步骤,为每一步定义一个函数;面试题27“二叉搜索树与双向链表”,通常分治法思路都可以用递归的代码实现;面试题28“字符串的排列”,把整个字符串分为两部分:第一个字符及它后面的所有字符。
11.时间效率与空间效率的平衡
降低时间复杂度的第一个方法是改用更加高效的算法。比如用动态规划解面试题31“连续子数组的最大和”能把时间复杂度降低到O(n)O(n),利用快速排序的Partition函数能在O(n)O(n)时间解决面试题29“数组中出现次数超过一半的数字”和面试题30“最小的k个数字”。
降低时间复杂度的第二个方法是用空间换时间。比如面试题34“丑数”,用一个数组按照从小到大的顺序保存已经求出的丑数;面试题43“n个骰子的点数”,交替用两个数组求骰子每个点数出现的次数;面试题35“第一个只出现一次的字符”,数组实现一个简易哈希表,实现O(1)O(1) 查找任意字符。
要会计算时间、空间复杂度。
12.其他各项能力
沟通和学习能力,在较短时间内理解一个新概念并解决相关的问题。诸如数组的旋转(面试题8)、二叉树的镜像(面试题19)、丑数(面试题34)、逆序对(面试题36)等概念。
知识迁移能力,俗称“举一反三”的能力。比如面试题38“数字在排序数组中出现的次数”,可以把二分查找的思想稍作变换,用二分查找算法在排序数组中查找重复数字的第一个和最后一个,从而得到数字在数组中出现的次数;面试题40“数组中只出现一次的数字”,面试官先问一个简单的问题即数组中只有一个数字只出现一次的情况,你应该能想到用异或的方法找到这个数字,他再追问如果有两个数字只出现一次怎么办,你应该从前面的思路得到启发:或许可以把整个数组一分为二,每个子数组包含一个只出现一次的数字,接下来我们可以集中精力想办法把数组一分为二。
抽象建模能力,把各种现实问题抽象成数学模型并用计算机编程表达出来。建模的第一步是选择合理的数据结构来表述问题,如面试题45“圆圈中最后剩下的数字”,用一个环形链表模拟一个圆圈;建模的第二步是分析模型内在规律,并用编程语言表述这种规律,如面试题45“圆圈中最后剩下的数字”,我们经过严密的数学分析后才能找到每次从圆圈中删除的数字的规律,从而找到一种不需要辅助环形链表的快速方法来解决问题。
发散思维能力。如面试题46“求1+2+…+n”,面试官有意限制不能使用乘除法及与循环、条件判断、选择相关的关键字;面试题47“不用加减乘除做加法”,当四则运算被限制使用的时候,你能否迅速从二进制和位运算这个方向寻找突破口。

面试杂感

  • 复杂算法可能是两个常规算法的结合,比如:求二叉树和最大的子路径(结点值可能为负、路径不一定包括根结点和叶结点)=深搜+最长上升子序列;大数的爬楼梯问题(递归+大数加法)
  • 排过序的东西想想二分,多组的话想想归并
  • 补充知识点:排列组合(参考:leetcode总结无止境系列之排列组合算法)
  • -

《剑指offer》之知识汇总相关推荐

  1. 《剑指Offer》题解汇总索引表(leetcode)

    <剑指Offer>题解汇总索引表(leetcode)

  2. 《剑指 Offer》题目汇总

    文章目录 1. 数组 2. 链表 3. 栈和队列 4. 哈希表 5. 字符串 6. 树 7. 堆 8. 回溯和深度优先搜索 9. 递归和循环 10. 双指针 11. 动态规划 12. 贪心算法 13. ...

  3. 剑指offer (From Leetcode) 汇总

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  4. 剑指Offer 66题 python版本 汇总

    牛客网剑指offer 66题汇总 (python) 有部分参考牛客网答案,部分为自己提交结果 1. 二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每 ...

  5. LeetCode刷题——剑指offer深度优先搜索题目汇总

    剑指offer深度优先搜索题目汇总 剑指 Offer 12. 矩阵中的路径 剑指 Offer 34. 二叉树中和为某一值的路径 剑指 Offer 36. 二叉搜索树与双向链表 剑指 Offer 54. ...

  6. 剑指Offer——毕业生求职网站汇总(干货)

    #剑指Offer--毕业生求职网站汇总(干货) 致2017即将毕业的你~ ##精品网站 牛客网:https://www.nowcoder.com 赛码网:http://www.acmcoder.com ...

  7. 【LeetCode 剑指offer 刷题笔记】汇总(已完成)

    前言   不知不觉就结束了自己的秋招之路,虽感觉有些艰辛但是收获很多.找工作那段时间做了很多学习笔记,这是数据结构与算法相关的一部分笔记,这一块除了复习相关教科书,还有就是刷LeetCode和< ...

  8. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  9. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题

    各位程序猿: <剑指Offer> 一书源自该书作者何海涛坚持更新与编写的博客( http://zhedahht.blog.163.com/ ),该博客收集整理了大量如微软.Google等知 ...

  10. 何海涛——《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题

    <剑指Offer> 一书源自该书作者何海涛坚持更新与编写的博客( http://zhedahht.blog.163.com/ ),该博客收集整理了大量如微软.Google等知名IT企业的经 ...

最新文章

  1. 郁闷。用户的无聊话题
  2. Spring Cloud云服务架构 - common-service 项目构建过程
  3. 马哥运维架构 第一周作业
  4. eclipse里source的快捷方法_Eclipse开发必备快捷键
  5. JQuery EasyUI combobox(下拉列表框)
  6. ts定义html是什么类型,TypeScript—类型定义文件(*.d.ts)
  7. 数据科学家访谈录 百度网盘_您应该在数据科学访谈中向THEM提问。
  8. 百度面试 php后端,2019.7最惨的三次面试经历-----百度PHP实习生面经
  9. 你的手机支持5Gwifi吗?5G上网真的很快吗?
  10. jar包上传到jcenter
  11. 快速计算Distinct Count
  12. http://blog.51cto.com/forsk/1531568
  13. test.php变成夏总,test.php
  14. 打开你企业发展之门的钥匙
  15. Java中面向对象和面向过程的简单理解以及共同点和区别
  16. python中返回上一步操作的快捷键_在计算机中返回上一步的快捷键
  17. 二维码生成器:问卷星怎么生成二维码?
  18. 文件夹怎么打包压缩?压缩包太大如何缩小?
  19. gatk过滤_GATK使用方法详解(原始数据的处理)
  20. layer的move要怎么用

热门文章

  1. html添加省市县联动下拉框,JSON+JS实现省市县三级联动下拉框
  2. FastAPI获年度第一新兴框架,2021年最受欢迎的TOP 100开发工具出炉
  3. Qt网络编程(1):QTcpSocket和QTcpServer的基本使用
  4. 6.5一些keil编程错误总结
  5. NOKOV Seeker2.2动作捕捉软件与ROS的通信
  6. libcef-Vs2017-下载编译第一个libcef3项目
  7. Windows NT各版本对应关系
  8. 安装mysql中error nr.1045_win10系统安装mysql提示error Nr.1045如何解决
  9. PHPCMS 前台模板集合
  10. 阿里巴巴 研发工程师Java暑期实习一面