您的位置:首页 > 职场人生

剑指offer-4-解决面试题的思路

2016-07-12 19:38 239 查看
面试官谈面试思路

画图让抽象问题形象化

举例让抽象问题具体化

分解让复杂问题简单化

面试官谈面试思路

编码前讲自己的思路是一个考察指标。合格的应聘者需要在做事之前明白自己要做的事情究竟是什么,以及该怎么做。一开始就编码的人员,除非后面表现非常优秀,否则很容易通不过。

可以采用举例子、画图等多种方式,解释清楚问题本身和问题解决方案是关键。

画图让抽象问题形象化

画图是在面试过程中应聘者用来帮助自己分析、推理的常用手段。很多面试题很抽象,不是很容易找到解决办法。这时不妨画出一些与题目相关的图形,借以辅助自己观察和思考。图形能使抽象的问题具体化、形象化,应聘者说不定通过几个图形就能找到规律,从而找到问题的解决方案。

有不少与数据结构相关的问题,比如二叉树、二维数组、链表等问题,都可以采用画图的方法来分析。很多时候空想未必能想明白题目中隐含的规律和特点,随手画几张图却能让我们轻易找到窍门。比如在 面试题19:二叉树的镜像中我们画几张二叉树的图就能发现,求树的镜像的过程其实就是在遍历树的同时交换非叶节点的左右子节点。在 面试题20:顺时针打印矩阵中,我们画图之后很容易就发现可以把矩阵分解成若干个圆圈,然后从外向内打印每个圆圈。面试的时候很多人都会在边界条件上犯错误(因为最后一圈可能退化而不是一个完整的圈),如果画几张示意图,就能够很容易找到最后一圈退化的规律。对于面试题26“复杂链表的复制”,如果能够画出每一步操作时的指针操作,那接下来写代码就会容易得多。

在面试的时候应聘者需要向面试官解释自己的思路。对于复杂问题,应聘者光用语言未必能说得清楚。这个时候可以画出几个图形,边看图形边讲解,面试官就能更加轻松地理解应聘者的思路。

举例让抽象问题具体化

对于一个问题,当一眼看不出隐藏的规律的时候,我们可以试着用一两个具体的例子模拟操作的过程,这样说不定就能通过具体的例子找到抽象的规律。比如面试22:栈的压入、弹出序列 面试24:二叉搜索树的后序遍历也类似。

具体的例子也可以帮助我们向面试官解释算法思路。算法通常是很抽象的,用语言不容易表述得很清楚,我们可以考虑举出一两个具体的例子,告诉面试官我们的算法是怎么一步步处理这个例子的。例如在面试21:包含min函数的栈中,我们可以举例模拟压栈和弹出几个数字,分析每次操作之后数据栈、辅助栈和最小值各是什么。这样解释之后,面试官就能很清晰地理解我们的思路,同时她会觉得我们有很好的沟通能力,能把复杂的问题用很简单的方式说清楚。

具体的例子还能帮助我们确保代码的质量。在面试中写完代码之后,应该先检查一遍,确保没有问题再交给面试官。怎么检查呢?我们可以运行几个测试用例。在分析问题的时候采用的例子就是测试用例。

分解让复杂问题简单化

按照解决问题的步骤来分解复杂问题,每一步解决一个小问题。比如在面试26:复杂链表的复制中,将复杂链表复制的过程分解成三个步骤。在写代码的时候为每一步定义一个函数,这样每个函数完成一个功能,整个过程的逻辑也就非常清晰明了了。

分治法,“分而治之”,采用的是各个击破的思想。把分解之后的小问题各个解决,然后把小问题 的解决方案结合起来解决大问题。比如面试27:二叉搜索树与双向链表中,转换整个二叉树是一个大问题,先把这个大问题分解成转换左子树和右子树两个小问题,然后再把转换左右子树得到的链表和根节点链接起来,就解决了整个大问题。通常分治法思路都可以用递归的代码实现。

在面试28:字符串的排列中,把整个字符串分为两部分:第一个字符及它后面的所有字符。我们先拿第一个字符和后面的每个字符交换,交换之后再求后面所有字符的排列。整个字符串的排列是一个大问题,那么第一个字符之后的字符串的排列就是一个小问题。因此,这实际上也是分治法的应用,可以用递归实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  剑指offer 面试题