怎样做到 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 国际许可协议进行许可。