面对算法面试,“不畏惧”

让大家在面对面试中的算法的问题时,有一个合理的思考路径;

因为面试中的算法问题,通常并不“复杂”,远远不需要啃完一本《算法导论》面对算法面试,不畏惧

如何轻松的解决算法面试呢?

  • 算法面试不代表一定“正确”的回答每一道算法问题,但是合理的思考方式其实很重要,也是正确完成算法面试的前提
  • 算法面试优秀不意味着技术方面优秀
  • 技术面试优秀不意味着能拿到Offer

什么是给出合理的思考路径

首先算法面试目的不是给出一个“正确”的答案,而是要向面试官展示你解决问题的思路。“正确”本身就是一个相对的概念!

  • 算法面试不是考试
  • 把这个过程看作是和面试官一起探讨一个问题的解决方案
  • 对于问题的细节和应用环境,可以和面试官沟通,这种沟通本身很重要,它暗示了你的思考问题的方式。
  • 不要把自己当做解题的机器,一定记得调动你自身的积极性、热情。

比如面试官问你:“我们需要对一组数据进行排序” 我们该如何回答?

如果你只是说我考虑采用“快速排序”算法,它的时间复杂度 O(nlogn)相对于其它排序来说它的时间复杂度是最优的,所以我会选择它。

但是这种回答并不一定会让面试官满意,因为基于这个回答你只能让面试官只能看出来你确实会“快速排序算法”,可以你却忽略算法使用的具体环境,而在实际的项目中很多时候其实是有诸多正确的选择,而此时我们关注的不仅是“正确”,而更关注于更“优”。所以此时你就应该和面试官探讨,这组数据有什么特征?

一组数据进行排序,问题情况分析

  • 1. 说它是不是包含有大量的重复元素?
    如果有这种可能的话,三路快排是更好的选择
  • 2. 如果可以肯定这组数据的所有元素都是独特的
    使用普通的快速排序就可以了
  • 3.这组数据有什么样的特征?
    是否大部分数据距离它正确的位置很近?是否近乎有序?

银行业务按照业务的发生时间进行排序,这样的数据大多数都是在业务完成是存入库,如果按照业务发展的顺序去看他的话,就是近乎有序的,只有少数业务晚于业务时间查询。
此时,插入排序是更好的选择

  • 4.数据取值范围是否有限?比如对学生成绩排序
    这种情况,计数排序是更好的选择

  • 5.对排序有什么额外的要求?是否需要稳定的排序?
    如果是的话,归并排序可能是更好的选择

  • 6.数据的存储结构是怎样的?是否使用链表存储?
    如果是的话,快速排序就不适用了,而归并排序可能是更好的选择

  • 7.数据存储状态是怎样的?大小是否可以装载到内存里?
    数据量很大,或者内存很小,不足以装载在内存里,需要使用外排序

在面试过程中如果遇到了非常难的问题,对于你的对手来时也是难的。

关键在于你所表达出来的解决问题的思路。甚至通过表达解题思路的方向,得出结论:这个问题的解决方案应该在哪一个领域,我可以通过查阅或进一步学习解决问题。

面试中经常被问到的问题点

  • 项目经历和项目中遇到的实际问题
  • 你遇到的印象最深的bug是什么?
  • 面向对象编程
  • 设计模式
  • 网络安全;安全相关;内存相关;并发相关 ...
  • 系统设计

所以在准备算法面试的同时,也不要忘记上面的点。

技术面试优秀不意味着能拿到Offer

技术面试只是面试的一部分。面试不仅仅考察你的技术水平,还要了解你的过去以及形成的思考方式,行为方式。

关于过去:参与的项目至关重要

准备好合适的问题问面试官

  • 整个小组的大概运行模式、工作模式是怎样的?
  • 如果后要做的这个项目后续的规划是怎么规划的?
  • 对于产品中的某个问题是如何解决的?比如,你们公司遇到分布式事务解决方案?
  • 参与项目用的技术?为什么选择某些技术?选择技术的标准? 比如,为什么选择用angluar,而不是vue?
  • 我对某项技术很感兴趣,在你的小组中我会有怎样的机会深入其中?

如何准备算法面试

这里再次强掉一点,算法面试和面试时两个概念。算法面试只是面试中的一个环节。

不要轻视基础算法和数据结构,而只关注有意思的题目

  • 各种排序算法
  • 基础数据结构和算法的实现:如堆、二叉树、图...
  • 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集..
  • 基础算法:深度优先、广度优先、二分查找、递归...
  • 基础算法思想:递归、分治、回溯搜索、贪心、动态规划...

解决算法面试问题的整体思路

  • 注意题目中的条件
    比如,给定一个有序数组...

  • 有一些题目中的条件本质就是暗示:
    比如,设计一个0(nlogn)的算法

  • 无需考虑额外的空间
    就要考虑能不能开辟额外的空间,用额外的空间来换取时间优化。

  • 数据规模大概是1000
    设计一个O(n2)的算法就可以,因为O(nlogn)是可以处理百万级数据的

当没有思路的时候

不要忽视暴力解法。暴力解法通常是思考的起点。
例子:在一个字符从中寻找没有重复字母的最长子串
如"abcabcbb",则结果为"abc"
"bbbbb",则结果为 "b"

常用排序算法的时间复杂度

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 18年前的高考,现在想起来还记忆犹新。 那个时候对于我来说考大学犹如走独木桥,初中考高中一个班40来号人,也就几个...
    LLL714阅读 836评论 0 2
  • Reserva什么意思 酒标既是一瓶葡萄酒的脸面,也是它的身份证明,因此酒标上的信息往往具有某种重要的特定含义,或...
    Lilye阅读 828评论 0 2
  • 在小程序这边开发总结主要有一下几个方面。 外部人员的开发进度和开发质量需要关注和监控。这个部分可能是项目管理人员容...
    愤怒的螃蟹阅读 1,314评论 0 0
  • 岩石有凉亭,峭壁有绿叶,陆羽节节高。
    1朗朗阅读 213评论 0 0