4年以上破解技术面试的经验
一个可以解决任何技术面试问题的框架
我担任高级软件工程师 II(前端)已经有一段时间了,也曾担任过面试官和面试官。我主持过很多技术面试,也参加过同样多(甚至更多)的面试。
从在白板上讲解数据结构和算法问题,到与面试官结对编程,这次经历让我大开眼界,也让我意识到面试有多么耗费精力!
因此,在过去的 4 年里,我总结出了这个小框架,它帮助我在多家科技公司成功胜任了多个职位。
这个问题解决方法包含 5 个主要部分。
- 理解问题
- 探索具体案例
- 分解
- 求解或简化
- 回顾并重构
让我们逐一详细了解一下:
理解问题
拿到题目后,不要立刻敲击键盘或声明变量。深呼吸。仔细阅读题目,然后再读一遍。
“回答自己不理解的问题是愚蠢的。”
——乔治·波利亚《如何解决它》
然后,试着记下以下问题的答案:
- 我可以把问题重新表述一下吗?
- 这个问题需要考虑哪些输入?你可以在这里询问面试官关于输入参数的边界情况。
- 解决该问题后应该产生哪些输出结果?
- 能否根据输入确定输出?换句话说,我是否掌握足够的信息来解决这个问题?
- 我应该如何标记构成问题的重要数据(变量声明)?
探索具体示例
举例可以帮助你更好地理解问题。这些例子还能帮助你检验解决方案是否有效。
这可以帮助您更清楚地了解输入和输出的性质,并揭示任何极端情况。
这些只不过是针对问题陈述的用户故事或单元测试。
例如,请考虑以下问题:
编写一个 名为 charCount 的 函数,该函数接受一个字符串作为参数,并返回字符串中每个字符的计数?
例如:
charCount("aaa"); // Output -> {a:3}
charCount("hello"); // Output -> {h:1, e: 1, l: 2, o: 1}
// Check examples for empty inputs
charCount(""); // Output -> { }
// Check examples for invalid inputs
charCount(1234); // Output -> { }
// Check examples for invalid inputs
charCount(false); // Output -> { }
分解
这是最重要却又最容易被忽略或跳过的步骤之一。在整个问题解决过程中,你需要让面试官始终了解你的思路。
- 在分解问题的同时进行沟通
- 问一些诸如“这样听起来好吗?”或“我走的路对吗?”之类的问题。
- 请写注释,不要直接写代码。
- 请明确写出你需要采取的步骤。你只需要写出解决问题的伪代码或步骤即可。
问题分解的过程会促使你在编写代码之前先思考代码,并帮助你发现任何残留的概念性问题或误解。这是非常重要的一步,在你深入研究代码细节(例如语法)之前,它将对你大有帮助。
求解或简化
到这一步时,你应该已经写好了伪代码。现在你只需要编写代码即可。
逐个击破:分而治之策略。
分析对手的各个组成部分,确定如何控制每个部分,制造分裂并加以利用。——
罗伯特·格林
如果你遇到难题无法继续,别担心。试着把问题分解成更小的问题。先找到一个更简单的问题,然后解决它。这样做会让你获得成就感,从而帮助你从心理上克服困难,继续前进。
是的,情绪上确实如此。有时候我在解DSA题的时候会开始冒汗、口干舌燥。解题需要保持良好的心理状态,因为这毕竟是一场脑力游戏!
简单来说:
- 找到你所尝试做的事情的核心难点。
- 暂时忽略困难
- 写出一个简化的解
- 然后把这个难题重新考虑进去。
回顾与重构
这是最后一部分,但却是区分优秀候选人和良好候选人的关键所在!
对于重构,请问自己:
- 我可以查看结果吗?
- 我可以用其他方法得出结果吗?
- 我能一眼看懂答案吗?答案是否易于理解?
- 我可以用同样的方法解决其他问题吗?
- 我能否提升该方案的性能?
- 我还能想到其他重构方法吗?
- 其他人是如何解决同样的问题的?这属于框架中“回顾”部分的范畴!
祝你面试一切顺利(如果你有面试安排的话)。
感谢阅读❤
如果这篇博客对您有所帮助,请在Medium上关注我!您的支持是我前进的动力!
原文发表于adityatyagi.com
想建立联系吗?
请在Twitter和LinkedIn上关注我,或在下方评论区留言!
我叫Aditya,是一名高级软件工程师(前端方向)。我写博客,内容是关于Web开发的!
文章来源:https://dev.to/adityatyagi/4-years-of-cracking-technical-interviews-24o0