Go猜想录
大道至简,悟者天成
怎样做到 Bug Free

摘要

  • 如何在算法面试中正确的沟通?
    • 如何确定自己的算法是正确的?
    • 如何套出面试官要求的时间复杂度?
    • 如何知道自己 Hire or No Hire?
  • 如何让面试官在面试中感觉你很牛逼?
    • 为什么Coding Style很重要
    • 什么是Good Coding Style,什么是Bad Coding Style
  • 如何修炼Bug Free的能力
    • 一个技巧教你避免99%的Bug
    • 出现Bug以后如何快速Debug
  • 如何做到刷100题顶过别人刷300题
    • 算法面试精选100题
  • 算法面试考察范围与频率一览

面试评价体系

Logicality 逻辑思维能力

  • 是否能很快的想到一个 Work Solution
  • 是否能够在面试官点出问题后优化自己的 Solution

Code Quality 代码质量

  • 代码到底写完没有
  • 代码风格好不好
    • 可读性
    • 变量名、函数名命名
    • 空格与空行的正确使用
  • 异常检测
  • Bug Free

Communication 沟通能力

把面试官当作 Co-worker 而不是考官

让面试官愿意和你一起工作

几个面试沟通法则

  • 做一个题之前,先沟通清楚,得到面试官肯定,再开始写代码,写完以后再解释
    • 不要闷头写
    • 也不要一边写一边解释太多(容易写不完)
  • 可以要提示,经过提示做出来的题,也是可以拿到 Hire 的
    • 但是先自己努力想一下,别太容易放弃,容易让人觉得不会主动思考问题
  • 别和面试官吵架
    • 面试官带着答案来面试你的
    • 不同意见在大部分情况下,都是你自己想错了
  • 会就会,不会就不会,不要遮遮掩掩,坦诚很重要
    • 容易让人觉得和你沟通“不顺畅”
    • 做过的题就说做过,不要故意说没做过
    • 因为他既然已经怀疑你做过了,即使你说没有,他也无法打消这个顾虑,还不如让他换题

为什么好的代码质量很重要?

  • 代码就像一件艺术品,越是高级的程序员,越有代码洁癖 越是高级别的面试官,越在意你的代码质量
  • 拥有好的代码质量,会让面试官在心里为你默默加分 如果质量很差,面试官会在心里为你默默扣分 最终是否导致 Hire / No Hire,就是一个量变引起质变的问题
  • 拥有好的代码质量,还能够让你的代码少出 BUG 你以为只需要细心就可以不出 BUG,但是通过子函数化、避免全局变量等手段可以让你出 BUG 的概率大大降低

Bad Coding Style

  • 耦合度高
  • 重复代码
  • 全局变量

Good Coding Style

  • 使用含义清晰的变量名命名 + 简单易读的处理逻辑 用注释去解释让人看不懂的代码
  • 通过适当的子函数化的代码包装,多加空行 虽然代码更长了,但是能够让你的代码: 易读,易维护,不易错

Behavior Question 考什么?

你为什么来我们公司?

  • 错误:因为三番天气好,因为离家近,因为活少钱多
  • 一般:因为认可公司的文化,喜欢公司的使命,这里有很多优秀的员工
  • 优秀:我在 Facebook 上认识了我的初恋女友,我被 Facebook 连接世界的使命深深的感触到了,我也发现了很多 FB 的 BUG,我想来改掉

为什么离开现在的公司?

  • 错误:因为老板是傻逼,因为同事傻逼
  • 一般:因为没有成长空间了,要寻求更好的发展
  • 优秀:我非常喜欢上一家公司,之前的老板也非常希望我能够留下来,这是一个很难的决定,我希望寻求改变,之前的公司我已经基本熟悉各类业务,能够带团队了,现在希望能够加入到贵司获得更大的成长,因为贵司的上升空间更大,能够提供一个更大的平台让我实现我的价值

如何去平衡帮助新人和完成自己的工作?

  • 错误:优先完成自己的工作的同时,利用空余时间去帮助新人
  • 一般:我很乐于去帮助新人,我会根据事情的优先级去安排和平衡
  • 优秀:帮助新人也是我的工作之一,如果影响到了我自己的工作,我就自己加班完成

你还有什么想问我的?

  • 错误:工作压力大吗?加班吗?年假几天?有401k吗(五险一金)?
  • 一般:你们公司的技术栈是啥?我加入的团队多少人?
  • 优秀:我如何能够参与到更重要的项目中去?我提前可以为这份工作做哪些准备?

如何做到刷100题 = 别人刷300题

九章算法精选 100 道有代表性的面试题目 每个题做完都相当于啃下 3-5 道类似题


举个例子

通过单词阶梯II这个题目,能够:

  • 练习最复杂版本的 BFS 代码
  • 练习DFS
  • 理解 Hash 函数的时间复杂度
  • 锻炼子函数化的能力

通过 LRU 这个题,能够:

  • 练习数据结构设计类问题
  • 熟练链表操作(单向链表 & 双向链表)
  • 锻炼子函数化能力

通过K个有序数组中位数问题,能够:

  • 同时练习传统二分法和二分答案算法
  • 锻炼时间复杂度的分析能力
  • 锻炼子函数化的能力

算法面试知识点

算法/数据结构 大公司考察频率 其他公司考察频率 难度 建议刷题数 性价比
字符串 / 模拟法 20~50
排序算法 2~5
二分法 10~20
二叉树 / 链表 30~50
递归 / DFS 20~40
BFS / 拓扑排序 5~10 超高
堆(优先队列) 5~10
哈希表 10~30
双指针 10~20
动态规划 40~60
字典树 / 并查集 2~5

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。