算法和数据结构面试准备与问题-第1部分
许多新毕业生想敲响硅谷的大公司的大门,例如Facebook ,亚马逊,苹果,Netflix,谷歌和微软。 但是,为技术面试做准备是一个漫长而繁琐的过程。 我本人也是一名SW工程师,曾经去过那里,但是仍然有一天,我将需要再次面对这个过程。 因此,我决定写一些文章来提醒自己(和您)尽可能顺利地完成此过程。
有用的资源
算法(第1部分)和算法(第2部分)是两个最著名的免费在线算法课程,以防您需要刷新内存。
我还会推荐其他两本准备进行技术面试的人阅读:
- Adnan Aziz撰写的Elements Programming Interviews ,有300多个编程问题和解决方案,并且附带一张CD,其中包含您可以在IDE上练习的问题和解决方案的电子版本。
- **代码面试 , 盖尔·拉克曼·麦克道威尔 ( Gayle Laakmann McDowell) 其中也有很多编程问题和解决方案。
Prereq —复杂性时空
在深入探讨一些基本数据结构之前,我想谈谈另一个基本先决条件-复杂性分析。
重要的是要了解方法调用的时间复杂性,尤其是对数据结构执行操作的方法。 但是,为什么我们要关心呢? 当您开始在行业中工作时,复杂性分析将帮助您事先解决可伸缩性问题,做出更好的决策,找出效率和权衡,选择用于项目的数据结构,然后找到最佳解决方案。 最重要的是,这是一个常见的采访话题 。
关于空间复杂度,我们正在谈论辅助空间与空间复杂度。 辅助空间是执行算法所需的额外内存。 空间复杂度是执行算法所需的存储器,该算法包括输入大小以及辅助空间。 当要求您进行空间复杂性分析时,通常人们会询问辅助空间(不考虑输入大小)。 但是, 您有责任询问访问员是否也对输入大小感兴趣 。
一个讨论时间复杂度和空间复杂度的简单示例:
function printAndSaveAllNames (array) { // Input size n
// instantiate an empty array, constant space size
var result = [];
// instantiate a counter, constant space size
for ( var i =0; i < array. length ; i++) {
// push n items into the array, linear space size, linear time
result.push("Name: " + array[i]);
}
}
// Time: n * 1 = n, Linear time complexity: O(n)
// Auxiliary space : n + 2,
// Space complexity = input + auxiliary space = n + n + 2 = 2n + 2
// Drop coefficients and lower order terms ...
// Linear space complexity: O(n)
常见的Big-O订单(和示例)
对于渐近符号,我们将Big-O用作上限,将Big-Ω(omega)用作下限,将Big-θ(theta)用作紧密界限。
●常数O(1)-与输入大小无关
○在哈希中查找键
○算术运算
○分配值
○更新数组中现有元素的值
●线性O(n)-与输入大小成比例增长
○在链接列表或数组中查找项目
○遍历元素集合(for循环,while循环等)
●二次O(n ^ 2)-与输入大小的平方成正比增长
○嵌套循环
○遍历二维数组
○插入排序
●对数O(logn)-对数增长到输入大小
○二进制搜索排序数组中的值
○在二进制搜索树中插入值
●拟线性O(nlogn)-比较排序算法常用
○快速排序
○合并排序
○堆排序
●多项式O(n ^ c)-c是常数
○深层嵌套循环
●指数O(c ^ n)-c是常数
○多种递归算法
●阶乘O(n!)-与输入大小的阶乘成比例增长
○寻找排列
在我的下一篇文章中 (我没想到已经花了2个小时来写这篇文章……),我将开始谈论数组和字符串的数据结构,并希望涵盖一些常见的面试问题。
你走之前 -
没有比在Medium( Victor Lin )上追随我更好的支持我的方法了。 让我知道我应该写更多!
您是否知道按下????按钮最多可以放弃50????? 如果您再次喜欢本文,请尝试一下!