剑指offer-4-解决面试题的思路
2016-07-12 19:38
239 查看
面试官谈面试思路
画图让抽象问题形象化
举例让抽象问题具体化
分解让复杂问题简单化
可以采用举例子、画图等多种方式,解释清楚问题本身和问题解决方案是关键。
有不少与数据结构相关的问题,比如二叉树、二维数组、链表等问题,都可以采用画图的方法来分析。很多时候空想未必能想明白题目中隐含的规律和特点,随手画几张图却能让我们轻易找到窍门。比如在 面试题19:二叉树的镜像中我们画几张二叉树的图就能发现,求树的镜像的过程其实就是在遍历树的同时交换非叶节点的左右子节点。在 面试题20:顺时针打印矩阵中,我们画图之后很容易就发现可以把矩阵分解成若干个圆圈,然后从外向内打印每个圆圈。面试的时候很多人都会在边界条件上犯错误(因为最后一圈可能退化而不是一个完整的圈),如果画几张示意图,就能够很容易找到最后一圈退化的规律。对于面试题26“复杂链表的复制”,如果能够画出每一步操作时的指针操作,那接下来写代码就会容易得多。
在面试的时候应聘者需要向面试官解释自己的思路。对于复杂问题,应聘者光用语言未必能说得清楚。这个时候可以画出几个图形,边看图形边讲解,面试官就能更加轻松地理解应聘者的思路。
具体的例子也可以帮助我们向面试官解释算法思路。算法通常是很抽象的,用语言不容易表述得很清楚,我们可以考虑举出一两个具体的例子,告诉面试官我们的算法是怎么一步步处理这个例子的。例如在面试21:包含min函数的栈中,我们可以举例模拟压栈和弹出几个数字,分析每次操作之后数据栈、辅助栈和最小值各是什么。这样解释之后,面试官就能很清晰地理解我们的思路,同时她会觉得我们有很好的沟通能力,能把复杂的问题用很简单的方式说清楚。
具体的例子还能帮助我们确保代码的质量。在面试中写完代码之后,应该先检查一遍,确保没有问题再交给面试官。怎么检查呢?我们可以运行几个测试用例。在分析问题的时候采用的例子就是测试用例。
分治法,“分而治之”,采用的是各个击破的思想。把分解之后的小问题各个解决,然后把小问题 的解决方案结合起来解决大问题。比如面试27:二叉搜索树与双向链表中,转换整个二叉树是一个大问题,先把这个大问题分解成转换左子树和右子树两个小问题,然后再把转换左右子树得到的链表和根节点链接起来,就解决了整个大问题。通常分治法思路都可以用递归的代码实现。
在面试28:字符串的排列中,把整个字符串分为两部分:第一个字符及它后面的所有字符。我们先拿第一个字符和后面的每个字符交换,交换之后再求后面所有字符的排列。整个字符串的排列是一个大问题,那么第一个字符之后的字符串的排列就是一个小问题。因此,这实际上也是分治法的应用,可以用递归实现。
画图让抽象问题形象化
举例让抽象问题具体化
分解让复杂问题简单化
面试官谈面试思路
编码前讲自己的思路是一个考察指标。合格的应聘者需要在做事之前明白自己要做的事情究竟是什么,以及该怎么做。一开始就编码的人员,除非后面表现非常优秀,否则很容易通不过。可以采用举例子、画图等多种方式,解释清楚问题本身和问题解决方案是关键。
画图让抽象问题形象化
画图是在面试过程中应聘者用来帮助自己分析、推理的常用手段。很多面试题很抽象,不是很容易找到解决办法。这时不妨画出一些与题目相关的图形,借以辅助自己观察和思考。图形能使抽象的问题具体化、形象化,应聘者说不定通过几个图形就能找到规律,从而找到问题的解决方案。有不少与数据结构相关的问题,比如二叉树、二维数组、链表等问题,都可以采用画图的方法来分析。很多时候空想未必能想明白题目中隐含的规律和特点,随手画几张图却能让我们轻易找到窍门。比如在 面试题19:二叉树的镜像中我们画几张二叉树的图就能发现,求树的镜像的过程其实就是在遍历树的同时交换非叶节点的左右子节点。在 面试题20:顺时针打印矩阵中,我们画图之后很容易就发现可以把矩阵分解成若干个圆圈,然后从外向内打印每个圆圈。面试的时候很多人都会在边界条件上犯错误(因为最后一圈可能退化而不是一个完整的圈),如果画几张示意图,就能够很容易找到最后一圈退化的规律。对于面试题26“复杂链表的复制”,如果能够画出每一步操作时的指针操作,那接下来写代码就会容易得多。
在面试的时候应聘者需要向面试官解释自己的思路。对于复杂问题,应聘者光用语言未必能说得清楚。这个时候可以画出几个图形,边看图形边讲解,面试官就能更加轻松地理解应聘者的思路。
举例让抽象问题具体化
对于一个问题,当一眼看不出隐藏的规律的时候,我们可以试着用一两个具体的例子模拟操作的过程,这样说不定就能通过具体的例子找到抽象的规律。比如面试22:栈的压入、弹出序列 面试24:二叉搜索树的后序遍历也类似。具体的例子也可以帮助我们向面试官解释算法思路。算法通常是很抽象的,用语言不容易表述得很清楚,我们可以考虑举出一两个具体的例子,告诉面试官我们的算法是怎么一步步处理这个例子的。例如在面试21:包含min函数的栈中,我们可以举例模拟压栈和弹出几个数字,分析每次操作之后数据栈、辅助栈和最小值各是什么。这样解释之后,面试官就能很清晰地理解我们的思路,同时她会觉得我们有很好的沟通能力,能把复杂的问题用很简单的方式说清楚。
具体的例子还能帮助我们确保代码的质量。在面试中写完代码之后,应该先检查一遍,确保没有问题再交给面试官。怎么检查呢?我们可以运行几个测试用例。在分析问题的时候采用的例子就是测试用例。
分解让复杂问题简单化
按照解决问题的步骤来分解复杂问题,每一步解决一个小问题。比如在面试26:复杂链表的复制中,将复杂链表复制的过程分解成三个步骤。在写代码的时候为每一步定义一个函数,这样每个函数完成一个功能,整个过程的逻辑也就非常清晰明了了。分治法,“分而治之”,采用的是各个击破的思想。把分解之后的小问题各个解决,然后把小问题 的解决方案结合起来解决大问题。比如面试27:二叉搜索树与双向链表中,转换整个二叉树是一个大问题,先把这个大问题分解成转换左子树和右子树两个小问题,然后再把转换左右子树得到的链表和根节点链接起来,就解决了整个大问题。通常分治法思路都可以用递归的代码实现。
在面试28:字符串的排列中,把整个字符串分为两部分:第一个字符及它后面的所有字符。我们先拿第一个字符和后面的每个字符交换,交换之后再求后面所有字符的排列。整个字符串的排列是一个大问题,那么第一个字符之后的字符串的排列就是一个小问题。因此,这实际上也是分治法的应用,可以用递归实现。
相关文章推荐
- 一个关于if else容易迷惑的问题
- 一道sql面试题附答案
- C# 超高面试题收集整理
- 人人网javascript面试题 可以提前实现下
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)
- 10个经典的Java main方法面试题
- 小米公司JavaScript面试题
- 超级全面的PHP面试题整理集合第1/2页
- 极易被忽视的javascript面试题七问七答
- 5个实用的shell脚本面试题和答案
- PHP经典面试题集锦
- 8个PHP数组面试题
- 高级MySQL数据库面试问题 附答案
- PHP中提问频率最高的11个面试题和答案
- 用PHP解决的一个栈的面试题
- Android工程师面试题大全
- PHP面试题之文件目录操作