技术面试方法
第一步:重申问题
第二步:澄清你的假设
步骤3:创建测试用例
步骤 4/5:讨论/执行强力和/或优化解决方案
步骤 6:测试您的测试用例
步骤 7:讨论时间/空间复杂度
YMMV
面试准备资源
对于刚入行的开发者新手来说,技术面试过程可能感觉像是一项艰巨的挑战。幸运的是,我最近有幸结识了一位优秀的开发者Abby Tiffany,她向我介绍了一个很棒的框架,供我在未来的技术面试中参考。
附注:在听到Abby作为Lauren Lee播客《我们属于这里:从非传统科技之路中汲取的经验教训》中精彩的一集后,我和她建立了联系。我强烈建议你听一听!
在这篇博文中,我将引导您完成一个技术面试问题的示例,并向您讲解 Abby 概述的步骤。
我们的示例问题:给定一个数组,删除任何重复的值并返回一个包含唯一值的数组。
第一步:重申问题
在深入探讨问题之前,请先花几分钟思考一下面试官问的问题,然后复述给面试官听。你可能听到面试官问了一件事,但他们提问的意图可能完全不同。
第二步:澄清你的假设
现在该你问一些澄清问题了!不要以为你已经正确理解了面试官的问题和期望。
示例问题包括:
- 您说的删除重复值是指每个元素只出现一次吗?还是说,出现超过一次的值应该从数组中彻底删除?
- 我的输入总是一个数组吗?
- 我是否会得到一个空的输入?
- 如果未找到目标,我的代码应该返回什么?
- 我应该将 -1 视为等于 1 吗?
- 我的代码应该如何处理单个项目的输入?
- 输入是否已排序?如果是,是降序还是升序?
- 数组是否应该就地更新?
步骤3:创建测试用例
现在你已经了解了问题本身以及预期的输入/输出,不妨花点时间写下一些测试用例,用于验证。理想情况下,你的测试用例应该涵盖各种不同的输入(例如:预期输入、空数组、负数等)。
示例测试用例可能包括:
测试用例 1:[0,1,1,4,9]
测试用例 2:[]
测试用例 3:[-1,0,1,2,2,2,3,10]
测试用例 4:[1]
步骤 4/5:讨论/执行强力和/或优化解决方案
理想情况下,你应该能够阐述一个强力解决方案,并在白板上执行你的优化方案。然而,你可能会遇到一些非常棘手的问题。也许你只能想到强力解决方案——在这种情况下,请执行强力解决方案,并讨论你会如何考虑不同的解决方案,或者在下一次迭代中对其进行优化。请记住,你应该只写下强力解决方案或优化方案。你没有足够的时间或白板空间来同时完成这两项工作。
现在你可能会问——既然你可能知道一个优化方案,为什么还要讨论蛮力法呢?面试官想知道你知道什么,除非你讲出来,否则他们无法知道。能够同时讲解这两种方法,表明你的知识量很大,而不是仅仅记住了问题的答案。
暴力破解
解决我们提供的示例问题的一种方法是遍历数组中的每个项目,将其与数组中的每个其他项目进行比较,并删除任何重复项。
这种方法肯定能满足问题的要求,但对我们来说,它并非最高效的处理方式。将每个元素与其他元素进行比较会导致时间/空间复杂度达到 o(n^2),因为最坏的情况是要求计算机比较数组中的每个排列。我们绝对可以做得更好!
优化方法
解决我们提供的问题的更好方法可能如下所示:
- 创建一个默认值为 0 的哈希表(或字典)
- 遍历数组中的值
- 检查当前正在查看的项目是否已经是 Hashtable 中的键
- 如果是,则将其设置为 nil(或任何其他值以供将来删除时参考)
- 如果不是,则将其作为值为 1 的键添加到 Hashtable 中并继续!
- 在程序结束时返回调整后的数组
def remove_duplicates(arr)
return if arr.length <= 1
count = Hash.new(0)
arr.each_with_index do |number, index|
if count[number] != 0
arr[index] = nil
else
count[number] += 1
end
end
arr.delete(nil)
end
这是解决这个问题的更有效的方法,因为它只需要你查看每个值以在一个循环中检查重复项,然后在单独的循环(.delete)中查找删除,从而给你一个时间/空间复杂度 O(n)。
步骤 6:测试您的测试用例
现在你已经了解了暴力破解方法,并执行了优化版本,是时候参考你之前花时间构思的测试用例了。把每个测试用例都放在你的优化方案中,这样就能有机会发现代码中的任何错误,或者证明它存在错误!
步骤 7:讨论时间/空间复杂度
这可以表现为与面试官进一步讨论你优化方案的时间/空间复杂度,以及是否有任何改进空间。面试官甚至可能会问你如何调整代码以适应不同的时间/空间需求。
这听起来可能有点吓人,但 Big-O 不一定是 Big-Oh No!我不会为这个糟糕的笑话道歉,但如果你和我一样是技术面试新手,我会在文章末尾提供一些资源来补充你对 Big-O 符号的理解。
YMMV
这只是一种方法,可能不适合你解决问题的方式,但没关系!找到最适合你的方法至关重要,制定一个适合自己的解决问题的流程,能让你更好地在技术面试中保持自信。
你还有其他在技术面试过程中有用的技巧吗?我很想听听!
面试准备资源
- 破解编码面试
- 基础.cs
- LeetCode
- Abby 的建议:练习题每次不要超过 45 分钟。让你的大脑休息一下。
- 作者注:我可以证明这是个好建议,每天花 5-6 个小时练习题目会让你的大脑变得一团糟。
- 数据结构和算法的直观指南
- 寻找对数背后的逻辑
- Big O 备忘单
- 极客对极客
- 聚会!有很多很棒的编程面试准备聚会,而且能和真人结对总是件好事。