面向Java和Python的算法和数据结构访谈问题


优步和网飞等公司有很多计算机科学毕业生和程序员申请编程、编码和软件开发职位;像这样的大组织Amazon,Microsoft,和Google;以及基于服务的公司,如印孚瑟斯或卢克索。但是他们中的许多人都不知道当你申请这些公司的工作时会遇到什么样的编程面试问题。

在本文中,我将分享一些常见的算法和数据结构面试问题,这些问题来自对不同经验水平的程序员的不同面试,从刚从大学毕业的人到有一到两年经验的程序员。

编码面试主要包括data structure and algorithm-based questions以及一些逻辑问题,如“如何在不使用临时变量的情况下交换两个整数?”

我认为将编码面试问题分成不同的主题领域是有帮助的。我在采访中最常看到的主题领域是数组、链表、字符串、二叉树,以及来自算法的问题(例如字符串算法、排序算法等quicksort 或者radix sort,以及其他杂项),这就是您将在本文中找到的内容。

不能保证你会被问到这些编码或数据结构和算法问题,但它们会让你对你在实际编程面试中可能遇到的问题有足够的了解。

一旦你完成了这些问题,你应该有足够的信心参加任何面试。

顺便说一句,如果你对基本的数据结构和算法没有足够的了解,或者你已经很久没有接触过它们,那么尝试这些问题是没有意义的。

在这种情况下,你应该选择一门好的课程,比如Algorithms and Data Structures Part 1 and 2 By Robert Horvick更新你的数据挖掘和算法技能。



50大算法和编程面试问题

没有任何进一步的麻烦,这里是我列出的一些编程面试中最常见的编码面试问题。我也用Java分享了大多数问题的解决方案,但是如果你是Python开发人员,你可以用Python检查逻辑和实现。你也可以用谷歌找到大多数问题的答案,因为它们很常见。

1.阵列编码面试问题

数组是最基本的数据结构,它将元素存储在一个连续的存储位置。这也是面试官最喜欢的话题之一,你会听到很多关于数组的问题coding interview例如反转数组、对数组进行排序或搜索数组中的元素。

数组数据结构的主要好处是,如果您知道索引,它可以提供快速的0(1)搜索,但是在数组中添加和删除元素比较慢,因为一旦创建了数组,就不能改变数组的大小。

为了创建更短或更长的数组,您需要创建一个新数组,并将所有元素从旧数组复制到新数组。

解决基于数组的问题的关键是充分了解array data structure以及基本的编程结构,如循环、递归和基本运算符。

以下是一些流行的基于数组的编码面试问题,供您练习:

  1. 在给定的1到100的整数数组中,如何找到缺失的数字?(solution
  2. 如何在给定的整数数组中找到重复的数字?(solution
  3. 如何在未排序的整数数组中找到最大和最小的数字?(solution
  4. 如何找到一个整数数组中所有和等于给定数的对?(solution
  5. 如果数组中包含多个重复项,如何找到重复的数字?(solution
  6. 在Java中,如何从给定的数组中删除重复项?(solution
  7. 如何使用快速排序算法对整数数组进行排序?(solution
  8. 如何就地从阵列中移除重复项?(solution
  9. 在Java中,如何在适当的位置反转数组?(solution
  10. 如何在不使用任何库的情况下从阵列中删除重复项?(solution

这些问题不仅有助于您发展解决问题的技能,还能提高您对数组数据结构的了解。

如果你需要更多基于数组的高级问题,那么你也可以看到The Coding Interview Bootcamp: Algorithms + Data Structures,这是一门关于算法的训练营式课程,专门为在谷歌、微软、苹果、脸书等科技巨头谋职的面试准备而设计。

而且,如果你觉得10个问题不够,你需要更多的练习,那么你也可以看看下面的列表30 array questions

2.链表编程面试问题

Alinked list是补充数组数据结构的另一种常见数据结构。与数组类似,它也是一种线性数据结构,以线性方式存储元素。

但是,与数组不同,它不会将它们存储在连续的位置;相反,它们分散在内存中的任何地方,并通过节点相互连接。

链表是一个节点列表,其中每个节点包含存储的值和下一个节点的地址。

由于这种结构,在链表中添加和删除元素很容易,因为您只需要更改链接而不是创建数组,但是搜索很困难,并且通常需要O(n)个时间来找到单个链表中的元素。

article提供了有关数组和链接列表数据结构之间差异的更多信息。

它也有多种形式,比如单链表,允许你在一个方向上遍历(向前或向后);双向链表,允许你双向遍历(向前和向后);最后是圆形链表,它形成了一个圆。

为了解决基于链表的问题,很好的了解recursion因为链表是一种递归数据结构。

如果从链表中取出一个节点,剩下的数据结构仍然是链表,因此,许多链表问题的递归解比迭代解更简单。

以下是一些最常见和最受欢迎的链接列表面试问题及其解决方案:

  1. 如何一次找到单链表的中间元素?(solution
  2. 如何检查给定的链表是否包含循环?你如何找到循环的起点?(solution
  3. 如何反转链表?(solution
  4. 如何在没有递归的情况下反转单链表?(solution
  5. 如何在未排序的链表中删除重复的节点?(solution
  6. 你如何找到单链表的长度?(solution
  7. 如何在单链表中找到从末尾开始的第三个节点?(solution
  8. 如何使用堆栈计算两个链表的总和?(solution

这些问题将有助于你发展解决问题的技能,同时提高你对链表数据结构的了解。

如果你在解决这些链表编码问题上有困难,那么我建议你通过浏览来更新你的数据结构和算法技巧Data Structures and Algorithms: Deep Dive Using Java当然。

您还可以查看以下列表30 linked list interview questions更多练习问题。

3.字符串编码面试问题

除了数组和链表数据结构之外,字符串是编程面试的另一个热门话题。我从来没有参加过编码面试string-based questions被问到。

关于字符串的一个好处是,如果你知道数组,你可以很容易地解决基于字符串的问题,因为字符串只不过是一个字符数组。

因此,您通过解决基于数组的编码问题所学到的所有技术也可以用来解决字符串编程问题。

以下是我在编程面试中常见的字符串编码问题:

  1. 如何打印字符串中的重复字符?(solution
  2. 如何检查两个字符串是否是彼此的字谜?(solution
  3. 如何打印字符串中的第一个非重复字符?(solution
  4. 如何使用递归来反转给定的字符串?(solution
  5. 如何检查字符串是否只包含数字?(solution
  6. 如何在字符串中找到重复字符?(solution
  7. 如何计算给定字符串中元音和辅音的数量?(solution
  8. 如何计算字符串中给定字符的出现次数?(solution
  9. 你如何找到一个字符串的所有排列?(solution
  10. 在不使用任何库方法的情况下,如何在给定的句子中颠倒单词?(solution
  11. 你如何检查两个弦是否互相旋转?(solution
  12. 如何检查给定的字符串是否是回文?(solution

这些问题有助于提高您对字符串作为数据结构的了解。如果你能在没有任何帮助的情况下解决所有这些字符串问题,那么你的状态很好。

对于更高级的问题,我建议你解决Algorithm Design Manual by Steven Skiena,这本书有最难的算法问题。

如果你需要更多的练习,这里有另一个列表20 string coding questions

4.二叉树编码面试问题

到目前为止,我们只研究了线性数据结构,但是现实世界中的所有信息都不能以线性方式表示,这就是树形数据结构的作用。

树形数据结构是一种数据结构,允许您以分层方式存储数据。根据存储数据的方式,有不同类型的树,例如binary tree,其中每个节点最多有两个子节点。

连同它的近亲binary search tree,它也是最流行的树数据结构之一。因此,你会发现很多基于它们的问题,比如如何遍历它们,计算节点,寻找深度,以及检查它们是否平衡。

解决二叉树问题的一个关键点是要有很强的理论知识,例如二叉树的大小或深度是多少,什么是叶子,什么是节点,以及对流行的遍历算法的理解,例如前、后和顺序遍历。

以下是软件工程师或开发人员工作面试中常见的基于二叉树的编码问题列表:

  1. 二叉查找树是如何实现的?(solution
  2. 如何在给定的二叉树中执行前序遍历?(solution
  3. 如何在没有递归的情况下,按照预先的顺序遍历给定的二叉树?(solution
  4. 如何在给定的二叉树中执行有序遍历?(solution
  5. 如何使用无递归的有序遍历打印给定二叉树的所有节点?(solution
  6. 如何实现后序遍历算法?(solution
  7. 如果没有递归,如何在后序遍历中遍历二叉树?(solution
  8. 二叉查找树的叶子是怎么印刷的?(solution
  9. 如何计算给定二叉树的叶节点数?(solution
  10. 如何在给定的数组中执行二分搜索法?(solution

如果你觉得你对二叉树编码的理解不够充分,你不能自己解决这些问题,我建议你回去选一门好的数据结构和算法课程,比如From 0 to 1: Data Structures & Algorithms in Java

如果你需要更多的建议,这里是我有用的列表data structure algorithm bookscourses首先。

5.杂项编码面试问题

除了基于数据结构的问题之外,大多数编程工作面试还会询问算法、设计、位操作和基于一般逻辑的问题,我将在本节中进行描述。

练习这些概念很重要,因为在实际的面试中,有时它们变得很难解决。

以前练习过它们不仅能让你熟悉它们,还能让你更有信心向面试官解释解决方案。

  1. 冒泡排序算法是如何实现的?(solution
  2. 迭代快速排序算法是如何实现的?(solution
  3. 如何实现插入排序算法?(solution
  4. 合并排序算法是如何实现的?(solution
  5. 如何实现桶排序算法?(solution
  6. 如何实现计数排序算法?(solution
  7. 基数排序算法是如何实现的?(solution
  8. 如何在不使用第三个变量的情况下交换两个数字?(solution
  9. 如何检查两个矩形是否相互重叠?(solution
  10. 你如何设计自动售货机?(solution

如果你需要更多这样的编码问题,你可以从以下书籍中获得帮助Cracking The Code Interview,由Gayle Laakmann McDowell 它展示了189个以上的编程问题和解决方案。一本在短时间内为规划工作面试做准备的好书。

顺便说一下,你在实践中解决的问题越多,你的准备就越好。所以,如果你认为50英镑不够,你需要更多,那么看看这些额外的50 programming questions telephone interviews这些呢books courses进行更彻底的准备。

现在你已经为编码面试做好了准备

这些是一些最常见的问题,可以帮助你在面试中做得很好。

我也在博客上分享了很多这样的问题blog,所以如果你真的感兴趣,你可以随时去那里寻找它们。

这些常见的编码、数据结构和算法问题是你在任何级别的编程工作中成功面试任何大公司或小公司都需要知道的。

如果你正在寻找一份2018年的编程或软件开发工作,你可以从这个编码问题列表开始准备。

这份清单提供了很好的准备主题,也有助于评估你的准备工作,找出你的强项和弱项。

良好的数据结构和算法知识对于成功编写面试非常重要,这也是你应该集中注意力的地方。

进一步学习:

闭幕词

谢谢,你看完了这篇文章!祝你的节目采访好运!这当然不容易,但是通过遵循这个路线图和指南,你离得到你一直想要的工作又近了一步。

如果你喜欢这篇文章,那么请与你的朋友和同事分享,不要忘记跟随@Dzonejavinpaul 在推特上!

注:如果您需要一些免费资源,您可以查看以下列表free data structure and algorithm courses开始准备。