第1章 面试的流程
第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
第5章 优化时间和空间效率
第6章 面试中的各项能力
第7章 两个面试案例
5.2 时间效率
由于每个人都希望软件的响应时间尽量短一些,所以软件公司都很重视软件的时间性能,都会在发布软件之前花不少精力做时间效率优化。这也就不难理解为什么很多公司的面试官都把代码的时间效率当做一个考查重点。面试官除了考查应聘者的编程能力之外,还关注应聘者有没有不断优化效率、追求完美的态度和能力。
首先,我们的编程习惯对代码的时间效率有很大影响。比如C/C++程序员要养成采用引用(或指针)传递复杂类型参数的习惯。如果采用值传递的方式,从形参到实参会产生一次复制操作。这样的复制是多余的操作,我们应该尽量避免。再举个例子,如果用C#做多次字符串的拼接操作,不要多次用String的+运算符来拼接字符串,因为这样会产生很多String的临时实例,造成时间和空间的浪费。更好的办法是用StringBuilder的Append方法来完成字符串的拼接。如果我们平时不太注意这些影响代码效率的细节,没有养成好的编码习惯,那么我们的代码可能就会让面试官大失所望。
其次,即使同一个算法用循环和递归两种思路实现的时间效率可能会大不一样。递归的本质是把一个大的复杂问题分解成两个或者多个小的简单的问题。如果小问题中有相互重叠的部分,那么直接用递归实现虽然代码显得很简洁,但时间效率可能会非常差(详细讨论见本书2.4.2节)。对于这种类型的题目,我们可以用递归的思路来分析问题,但写代码的时候可以用数组(一维或者多维数组)来保存中间结果基于循环实现。绝大部分动态规划算法的分析和代码实现都是分这两个步骤完成的。
再次,代码的时间效率还能体现应聘者对数据结构和算法功底的掌握程度。同样是查找,如果是顺序查找需要O(n)的时间;如果输入的是排序的数组则只需要O(logn)的时间;如果事先已经构造好了哈希表,那查找在O(1)时间就能完成。我们只有对常见的数据结构和算法都了然于胸,才能在需要的时候选择合适的数据结构和算法来解决问题。
最后,应聘者在面试的时候要展示敏捷的思维能力和追求完美的激情。听到题目的时候,我们一般很快就能想到最直观的算法。这个最直观的办法很有可能不是最优的,但也不妨在第一时间告诉面试官,这样面试官至少会觉得我们思维比较敏捷。我们想到几种思路之后面试官可能仍然不满意,还在提示我们有更好的办法。这个时候我们一定不能轻言放弃,而要表现出积极思考的态度,努力从不同的角度去思考问题。有些题目很难,面试官甚至不期待应聘者在短短几十分钟里想出完美的解法,但他会希望应聘者能够有激情、有耐心去尝试新的思路,而不是碰到难题就退缩。在面试的时候,应聘者的态度和激情对最终的面试结果也有很重要的影响。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论