3.2 解决问题
现在是解决问题的时候了,但不要立即跳进去。要记住,您需要完全理解这个问题。您应该先尝试一个例子,然后再关注于解决问题的算法。然后,您需要解释您的解决方案,并进行编码。下面是这个过程的步骤:
基本步骤
解决一个面试问题的最佳方式就是按照一定的方法来解决它。下面是建议的步骤:
1. 确保您理解了这个问题。您最初对问题的假定可能是错误的,或者面试考官的解释可能非常简短,难以完全理解。如果您对问题不理解,就不能展示您的技能。如果对问题本身有疑问,不要犹豫,应该询问面试考官。先要弄清楚问题,然后再开始解决问题。面试考官可能故意不把事情说清楚,目的是要确定您是否能找到并理解真正的问题。
2. 当您理解了问题之后,请尝试一个例子。这个例子可能让您找到解决问题的好方法,或者帮助您搞清楚一些还没有透彻理解的地方。从一个例子开始也展示了您在解决问题时的方法和逻辑。如果您不能立即找到解决方案,例子将是很有帮助的。
确保您在解决问题之前理解了问题,然后从一个例子开始,强化您的理解。
3. 关注您用来解决问题的算法。通常,这需要花较长的时间,并需要更多的例子。可以预期情况是这样的。在这个过程中,互动是很重要的。如果您静静地站着,盯着白板,面试考官就无法了解您是取得了积极的进展,还是一筹莫展。要与面试考官交谈,告诉他们您在做什么。例如,您可以这样说:“我在想是否能够将值保存在数组中,但我认为这不行,因为我不能够在数组中快速地按值查找。”这展示了您的技能,这是面试的关键,同时也可能会得到面试考官的暗示,他可能会说:“您已经很接近正确的解决方案了。您真的需要按值来查找元素吗?也许您可以…”
解决问题可能需要很长的时间,您可能很想在找到确切的解决方案之前就开始编码。请不要这样做。想一下您愿意与什么人一起工作:是长时间考虑问题然后一次就写出正确的代码的人,还是急忙开始解决问题,编码时犯一些错误,根本不知道自己在做什么的人?这不是一个困难的决定,不是吗?
4. 在确定了算法以及打算如何实现之后,请向面试考官解释您的解决方案。这让他们有机会在您开始编码之前评估您的解决方案。面试考官可能会说:“听起来不错,开始编码吧。”或者说:“好像有点不对,因为您不能够用这种方式在哈希表中查找元素。”不论是哪种情况,您都将得到有价值的信息。
5. 当您编码时,对自己在做的事情进行解释是很重要的。例如,您可能说:“现在,我把数组全部初始化为零。”这种做法让面试考官更容易跟上您的编码思路。 在编写代码之前和编写代码过程中,要向面试考官解释您在做的事情。要多说话!
6. 如果有需要,就提问。如果您问的是那些通过查手册能得到答案的问题,一般不会因此而受到惩罚。当然,您肯定不能问“这个问题怎样解决?”这样的问题。但您可以问这样的问题:“我不记得了,我要用本地日期格式打印该用哪一个格式字符串?”虽然最好是不要问这些问题,但这样问也不会出什么事。
7. 写完代码后,马上用例子走一遍,检查代码的正确性。这一步表明您的代码至少在一种情况下是能工作的。这也展示了您在这个过程中的逻辑,以及您检查代码和查错的愿望。这个例子也能帮您消除解决方案中的一些不太重要的小缺陷。
8. 确保针对所有的出错情况和特殊情况对代码进行检查,特别是边界条件。许多出错情况和特殊情况会被程序员忽略,在面试中忘记这些问题表明您可能在工作中忘记这些问题。例如,如果您动态地分配了内存,要确保检查分配没有失败(如果时间不允许您进行全面检查,至少要解释您会检查这种失败)。处理出错情况和特殊情况会给面试考官留下深刻印象,并帮助您正确地解决问题。
尝试一个例子,然后检查所有的出错情况和特殊情况。
当您尝试了一个例子,并对代码的正确性感到满意之后,面试考官可能会就您写的代码问一些问题。一般情况下,这些问题集中在运行时间、其他可能的实现以及复杂度等方面。如果面试考官不问这些问题,您应试主动提供这些信息,表明您已考虑了这些问题。例如,您应该说:“这个实现的运行时间是线性增长的,这是这个问题的最佳解决方案,因为我必须对所有的输入值进行检查。动态内存分配会稍微降低一点速度,递归算法也增加了一些开销。” 当您被卡住时 您应该预计到可能会在某个问题上被卡住,这是面试过程的一个重要部分。面试考官希望看到当您无法立即找到问题的答案时,会做出怎样的反应。遇到这种情况时,放弃或灰心丧气是最糟糕的反应。您应该表现出对问题的兴趣,并继续尝试解决它:
?回到例子。尝试执行这个任务,并分析您正在做的事情。尝试从特殊的例子扩展到一般情况。您可能需要使用非常详细的例子。这样做是可以的,因为这向面试考官展示了您锲而不舍地解决问题的精神。 当其他方法都失败了的时候,回到特定的例子。尝试从特定的例子扩展到一般的情况,从而找到解决方案。
?尝试不同的数据结构。也许链表、数组、哈希表或二分查找树能帮上忙。如果您遇到了不常见的数据结构,想想它与更常见的数据结构之间的相似性。使用正确的数据结构常常会使问题变得容易。
?考虑程序设计语言中较少使用或更高级的特性。有时候解决问题的关键就是使用这样的特性。
有时候不同的数据结构或高级的语言特性是解决问题的关键。 即使您没有被卡住,也可能遇到一点问题。您可能没有想到一种优雅的或明显的实现方式,编写了过多的代码。几乎所有的面试编码问题都有简单的答案。您很少需要编写超过15行的代码,几乎从来不会超过30行。如果您开始写很多代码,可能弄错了方向。
| 回书目 上一节 下一节 |
|
· C语言之基础自测获奖名.. · Linux服务器架设自测获.. · 边界网关安全防护自测.. · Cisco CCNA最新真题自.. · 我在美联储监管银行 书.. · 我在美联储监管银行 目.. |
· 我在美联储监管银行 前.. · 入侵的艺术 目录 · 入侵的艺术 前言 · 网管员全真面试题自测.. · 子弹的本质—— 形势没.. · 学习大量的词汇—— 对.. |
|
||||
| · Windows Server 2008 · SQL Server 2008/2005.. · 打造安全网络环境 · 网络安全产品检验规范 · 华为、贝恩资本22亿美.. · 社会工程学与网络安全 · 离职员工安全隐患 · 杀毒软件评测专题 |
· Sun以10亿美元并购开源.. · 中间件应用技术专题 · 杀毒软件优化和使用技巧 · 信息安全等级保护专题 · 补丁自动分发管理策略.. · 杀毒王牌 · AMD Phenom三核处理器.. · 国际文档格式标准开战 |
|||
|
||||
| · VPN技术 · SQL Server 2008/2005.. · SOA 面向服务架构 · 子网掩码教程 · SQL Server 2008/2005.. · 中间件应用技术专题 · 深入了解PGP加密技术 · MySQL数据库备份 |
· 病毒查杀专题 · VPN技术 · Solaris 10 配置管理 · Linux 基础 · SSL VPN详细知识 · Linux防火墙 · 路由器设置与口令恢复 · Linux 集群技术专题 |
|||
|
||||
| · VPN技术 · SQL Server 2008/2005.. · 中间件应用技术专题 · SQL Server 2008/2005.. · SOA 面向服务架构 · 子网掩码教程 · MySQL数据库备份 · 身份认证技术 |
· 病毒查杀专题 · 清除流氓软件——51CTO.. · SSL VPN详细知识 · Sniffer安全技术从入门.. · 常用交换机典型配置 · 路由器设置与口令恢复 · Linux 集群技术专题 · VPN技术 |
|||