如何在技术面试中提问


在最近的一篇文章中,我提供了准备工作时要考虑的事项的概述。 技术面试。 该内容的一部分已扩展为视频,包括一个用于进入白板时回答棘手问题的基本框架。 即使我专门研究iOS开发 ,该过程也足够通用,因此可以应用于任何编程语言:

  • 提出澄清问题
  • 创建一个概念图
  • 在伪代码中表达蛮力解决方案
  • 使用可行的代码优化您的解决方案
  • 检查错误或遗漏

当在时间限制下编码或处理不熟悉的主题时,遵循一组预定义的步骤变得尤为重要。 让我们看看如何使用此过程来回答以下问题:


“ ..您将如何设计一个Stack类,除了push和pop方法外,它还具有一个属性计数,该计数返回元素的数量? 推,弹出和计数都应在O(1)时间内进行。”


什么是堆栈?

作为iOS开发人员,我们习惯于使用Swift和iOS SDK来构建用户界面元素,流程和应用。 这个问题提供了价值,因为候选人(正确地)假设Stack不是开发中通常使用的东西。 从候选人的角度来看,这个问题的答案可以将管理UITableViews的日常活动与UINavigationController联系起来

什么是O(1)时间?

这个答案将揭示人们应该如何考虑算法的性能。 通过了解恒定时间的重要性-O(1),他们将看到以相同速度执行的流程具有显着的优势-无论其输入大小如何。 即使在面试中问这个问题是最好的做法,但事先学习Big O Notaton也会带来很多好处。

大声思考

我们都听说过这个,但是在实践中,很难遵循。 在解决问题以最终找到解决方案的过程中,我们需要让面试官知道我们的想法-即使我们的想法看起来很愚蠢或半生半熟。 在大多数情况下,面试官希望您成功,因此他们将寻找机会引导您朝正确的方向发展。 没有任何口头反馈,他们将无能为力。 众所周知,这通常是在事情变得紧张而尴尬的时候。

优化您的解决方案

在面试中编写代码时,最好的做法是编写一个“可行”的基本解决方案然后继续完善其语法和功能。 在性能方面,这通常会转化为在O(n)甚至O(n2)处构建可行的解决方案。 这个两步过程不仅提供了收集您的想法的机会,而且还使面试官知道您处在正确的轨道上。

最后,当您将代码重构为最终解决方案时,请问自己,如果必须处理1M数据行,该算法将如何执行? 重新定义问题通常可以使您的解决方案的各个部分看起来很扎实,但可以进一步加以改进。

代码

这是在Swift中实现的完整Stack类:

  //恒定时间操作-O(1)类Stack  { 
var store:[T] = [] func peek()-> T? {
返回store.last
} func push(_ value:T){
store.append(值)
} func pop()-> T? {
返回store.isEmpty吗? 无:store.removeLast()
}
}

喜欢这篇文章吗? 阅读并发现有关 Medium的 Swift算法书