算法面试

413 阅读3分钟

算法面试是什么?

总结自慕课网liuyubobobo老师的玩转算法面试-- Leetcode真题分门别类讲解

对新手很友好的:算法的时间与空间复杂度(一看就懂)

深入学习:前端该如何准备数据结构和算法?

算法面试不仅仅是正确的回答问题

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

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

给出合理的思考路径

  • 算法面试的目的不是给出一个“正确”答案,而是展示给面试官你思考问题的方式

“正确”本身是一个相对概念

  • 算法面试不是高考
  • 把这个过程看作是和面试官一起探讨一个问题的解决方案
  • 对于问题的细节和应用环境,可以和面试官沟通
  • 这种沟通本身很重要,它暗示着你思考问题的方式

“正确”的回答一个算法问题

  • 正确还包含对问题的独到见解;优化;代码规范;容错性......
  • 如果是非常难的问题,对你的竞争对手来说,也是难的。关键在于你所表达出的解决问题的思路
  • 甚至通过表达解题思路的方向,得出结论:这个问题的解决方案,应该在哪一个领域,我可以通过查阅或者进一步学习解决问题

算法面试只是面试的一部分

  • 关于过去:参与项目至关重要
  • 如何找到项目?
    • 实习
    • 参与实战课程学习:慕课网、Coursera......
  • 创建自己的项目
    • 自己做小应用:计划表、备忘录、播放器等
    • 自己解决小问题:爬虫、数据分析、词频统计等
    • “不是项目”的项目:一本优秀的技术书籍的代码整理等
    • 分享:自己的技术博客、github等
  • 通过过去了解你的思考行为方式
    • 遇到的最大的挑战?
    • 犯过的错误?
    • 遭遇的失败?
    • 最享受的工作内容?
    • 遇到冲突的处理方式?
    • 做的最与众不同的事儿?
  • 准备好合适的问题问面试官
    • 整个小组的大概运行模式是怎样的?

    • 整个项目的后续规划是如何的?

    • 这个产品中的某个问题是如何解决的?

    • 为什么会选择某些技术?标准?

    • 我对某个技术很感兴趣,在你的小组中我会有怎样的机会深入这种技术?

如何准备算法面试

算法面试的准备范围

  • 不要轻视基础算法和数据结构,而只关注“有意思”的题目
    • 各种排序算法
    • 基础数据结构和算法的实现:如堆、二叉树、图...
    • 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集...
    • 基础算法:深度优先、广度优先、二分查找、递归...
    • 基本算法思想:递归、分治、回溯搜索、贪心、动态规划...
  • 选择合适的OJ(online judge,在线判题系统)
    • 不要选择过于偏向程序设计竞赛的OJ(CODEFORCES, topcoder, CODECHEF)
    • LeetCode(真实的面试问题)
    • HackerRank(对问题的分类很详细)
  • 在学习和实践做题之间,要掌握平衡

如何回答算法面试问题

  • 注意题目中的条件

  • 当没有思路的时候

    • 自己给自己几个简单的测试用例,试验一下
    • 不要忽视暴力解法,暴力解法通常是思考的起点
  • 优化算法

  • 实际编写问题

    • 极端条件的判断(数组为空?字符串为空?数量为0?指针为null?)
    • 变量名
    • 模块化,复用性
  • 对于基本问题,白板编程