面试经典算法题集锦——《剑指 offer》小结

从今年 3 月份开始准备找实习,到现在校招结束,申请的工作均为机器学习/数据挖掘算法相关职位,也拿到了几个 sp offer。经历这半年的洗礼,自己的综合能力和素质都得到了一个质的提升。

实话说对于未来去哪里,即将如何发展还没有清晰的规划。迷茫总是会有的,但这并不是停止脚步的理由。找工作是在漫长的职业生涯中时常出现的转折点,而学习和和积累是终生的任务。

 

在准备面试过程中手写 bug free 代码的环节是必不可少的。本人并非 ACM 出身,虽说在学校基础课程学得还不错,但对于刷题并无太多经验,一开始还是吃力的。慢慢的发现这一过程还是挺有意思的,虽然校招找工作已结束,但这刷算法题会成为我新的爱好。最近将《剑指 offer》这本经典的面试宝典梳理了一遍,并实现和整理了书中的所有题目,并在“牛客网”上提交测试以保证代码的正确性。

平时有时间也可以刷一刷hihocoder,很多题目思考起来还是很有意思的。对于其他的课本,我觉得《算法导论》《编程珠玑》《编程之美》都是不错的经典教材,如果以后有时间也会一一对这几本书进行总结。

对于刷题,谈谈我的几点感受:

  1. 熟练一门编程语言很重要,这决定了你能不能将 idea 尽快实现并印证。在一开始可以先写一些 easy 的题,主要是将自己的编程语言练熟。本人主要使用 c++ 实现,其实算法涉及的结构不是很多,stl 基本就可以很好的 cover。
  2. 凡事开头难,坚持总是会有收获的。我建议刷题要有一个持续的过程,不要间断,最好一段时间集中攻克一件事情。比如 x 天完成一本书,或者一块内容,这样有助于集中精力突破。如果三天打鱼两天晒网,每次捡起来都很吃力,会形成恶性循环。题目刷多了以后会培养出感觉和思考问题的思路。
  3. 无论简单与否都要思考清楚再开始写代码。分析题目时可以将问题进行分解,还可以借助实例,做图抽象等方法帮助理解。
  4. 注意细节,写 bug free 的代码(应该成为一种追求)。实现代码过程中应该分析好输入输出,考虑好特殊情况和边界条件等。比如字符串转换成整数需要考虑:不合法输入,溢出等情况。使用指针时刻注意是否为空的判断等。
  5. 优美,鲁棒的高质量代码。不仅仅是追求完成功能,还应该对代码的布局,变量名见名见意,关键边界条件的检查等。代码是程序员交流的语言,因此应该写得优美
  6. 重复检查,人脑 debug。无论是否在手写代码的环境中,写完代码都应该养成重复 review 的习惯,自己跑几个测试用例,确定没有问题之后再把你代码交给面试官。
  7. 没有完美的代码,注意沟通完成满足需求的代码。每一个程序都可以看成是输入到输出的映射过程,而输入和输出总是有很多可能的,我们一个程序不可能 cover 掉大千世界,函数 function,也可以叫做“功能”,即完成一定任务的函数,这就需要我们通过沟通去了解用户的意图,将问题抽象,并基于某些假设去完成这样的 function。
  8. 解决问题的方法总是多样的。不管是做题还是平时练习,在完成任务的基础上应该还要发散性思考,一个题目的不同解法,相似题目的解法,相似场景的结局等。
  9. 在进行时间和空间复杂度分析时,要注意考虑实际使用的语言,其内置数据结构或函数的复杂度会影响你实际程序的复杂度。比如 C++ 中 map 和 unordered_map,set 和 unordered_set 的区别等。
  10. 一味的 practice,还要适时的总结和 review 才能及时的查漏补缺,让自己能更好的成长。

你可能感兴趣的:(面试经典算法题集锦——《剑指 offer》小结)