作者 | javinpaul
编译 | 王天宇、Jane
整理 | Jane
出品 | AI科技大本营
【导读】之前我们给同学们推荐了很多关于 Python 的面试资源,大家都表示很有用。这次营长表示要翻 Java 的牌子啦~ 应大家的强烈反馈,我们找了一套 Java 语言的算法和编程的面试题。
这份面试资源主要包含五部分内容:数组、链表、字符串、二叉树和重要算法(如排序算法)的编程面试题,其中每部分内容我们都列出了一些最常被问到的热门问题,并且在每个题目后给出了可以参考的解决思路和代码,因为题目较多,我们没有罗列所有的方法和代码,只给出了访问地址。相信大家在掌握了这些内容后,一定可以提升实力、信心大增。
数组,将元素存储到内存的连续位置中,是最基本的数据结构。在任何和编程相关的面试中,都会被问到和数组相关的问题,可以说是非常热门的考题之一。比如:将数组反转、对数组进行排序、搜索数组中的元素等。
数组数据结构的主要优点是如果知道索引就可以通过 O(l) 进行快速搜索,但是在数组中添加和删除元素的速度会很慢,因为数组一旦被创建,就无法更改其大小。如果需要创建更长或更短的数组,得先创建一个新数组,再把原数组中的所有元素复制到新创建的数组中。
解决数组相关问题的关键是要熟悉数组的数据结构和基本的构造,如循环、递归等等;下面给出了 10 道热门面试题帮助大家掌握知识并进行练习。
▌1.给定一个 1-100 的整数数组,请找到其中缺少的数字。
解决方法与代码:
https://javarevisited.blogspot.com/2014/11/how-to-find-missing-number-on-integer-array-java.html
▌2.请在给出的整数数组中找到重复的数字。
解决方法与代码:
▌3.如何在未排序的整数数组中找到最大值与最小值?
解决方法与代码:
http://java67.blogspot.com/2014/02/how-to-find-largest-and-smallest-number-array-in-java.html
▌4.在给定的成对整数数组中,请找出所有总和等于给定数字的组合。
解决方法与代码:
▌5.如果数组中有多个重复项,如何找到重复的数字?
解决方法与代码:
▌6.用 Java 语言实现,在给出的数组中,删除重复项。
解决方法与代码:
▌7.用 quicksort 算法实现对整数数组的排序。
解决方法和代码:
http://javarevisited.blogspot.com/2014/08/quicksort-sorting-algorithm-in-java-in-place-example.html
▌8.如何删除现有数组中的重复项?
解决方法和代码:
▌9.用 Java 语言把数组进行反转。
解决方法和代码:
http://javarevisited.blogspot.com/2013/03/how-to-reverse-array-in-java-int-String-array-example.html
▌10.如何在不调用库的情况下删除数组中的重复项?
解决方法和代码:
十个问题太少?更多复杂问题,可访问:
http://javarevisited.blogspot.sg/2015/06/top-20-array-interview-questions-and-answers.html
链表是另一种常见的数据结构,和数组相似,链表也是线性的数据结构并且以线性方式存储元素。而与数组不同的是,链表不是将元素存储在连续的位置中,而是可以存储在任意位置,彼此之间通过节点相互连接。
链表也可以说就是一个节点列表,每个节点中包含存储的值和下一个节点的地址。也正是因为这种结构,在链表里添加和删除元素很容易,你只需要更改链接而不用创建新的数组。但是搜索会很困难,并且在单链表中找到一个元素就需要 O(n)个时间。
链表有多种形式,如:单链表,允许你在一个方向上进行遍历;双链表,可以在两个方向上进行遍历;循环链表,最后节点的指针指向第一个节点从而形成一个环形的链;因为链表是一种递归数据结构,所以在解决链表问题时,熟练掌握递归算法就显得更加重要了。
下面是关于链表的一些最常见、热门的面试问题,大家可以着重练习:
▌1.如何在一次递归后找到单链表的中间元素?
解决方法和代码:
http://javarevisited.blogspot.sg/2012/12/how-to-find-middle-element-of-linked-list-one-pass.html
▌2.检查给定的链表中是否包含循环链表,并找出循环链表的起始节点。
解决方法和代码:
▌3.如何将列表反转(倒置)?
解决方法和代码:
http://www.java67.com/2016/07/how-to-reverse-singly-linked-list-in-java-example.html
▌4.如何在没有递归的情况下反转单链表?
解决方法和代码:
▌5.删除未经过排序的链表中重复的节点。
解决方法和代码:
https://www.geeksforgeeks.org/remove-duplicates-from-an-unsorted-linked-list/
▌6.计算单链表的长度。
解决方法和代码:
http://javarevisited.blogspot.sg/2016/05/how-do-you-find-length-of-singly-linked.html
▌7.找出单链表中倒数第三个节点。
解决方法和代码:
http://javarevisited.blogspot.sg/2016/07/how-to-find-3rd-element-from-end-in-linked-list-java.html
▌8.如何使用 Stack 查找两个链表的和?
解决方法和代码:
https://www.geeksforgeeks.org/sum-of-two-linked-lists/
这些问题可以帮你提升解决问题的能力,加深对链表数据结构的了解。
关于数组和链表间的区别,可详细阅读:
http://javarevisited.blogspot.sg/2013/07/difference-between-array-and-linked-list-java.html
更多复杂问题,可访问:
http://javarevisited.blogspot.sg/2017/07/top-10-linked-list-coding-questions-and.html
除了数组和链表数据结构,字符串是应聘过程中编程面试的另一个热门问题。在我参加过的编程面试中,每一个都涉及了有关字符串的问题。
值得庆幸的是,如果你了解数组,你可以很容易解决关于字符串的问题,因为字符串本身就是一个由字符组成的数组。
因此,你学过的所有用来解决数组编程问题的知识,也可以用来解决字符串的编程问题。
以下是一些在编程面试中高频出现的字符串问题:
▌1.如何输出字符串中重复的字符?
解决方法与代码:
http://java67.blogspot.sg/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html
▌2.如何判断两个字符串是否互为回文?
解决方法与代码:
▌3.如何找出字符串首个非重复的字符?
解决方法与代码:
▌4.如何用递归的方法将字符串进行反转?
解决方法与代码:
https://javarevisited.blogspot.com/2012/01/how-to-reverse-string-in-java-using.html
▌5.如何判断一个字符串是否只包含数字?
解决方法与代码:
▌6.如何找到字符串中重复的字符?
解决方法与代码:
http://java67.blogspot.sg/2014/03/how-to-find-duplicate-characters-in-String-Java-program.html
▌7.如何计算一个字符串中元音字母和辅音字母的个数?
解决方法与代码:
http://java67.blogspot.sg/2013/11/how-to-count-vowels-and-consonants-in-Java-String-word.html
▌8.如何计算一个给定字符在字符串中出现的次数?
解决方法与代码:
https://javarevisited.blogspot.com/2012/12/how-to-count-occurrence-of-character-in-String.html
▌9.如何找出一个字符串的所有排列组合?
解决方法与代码:
http://javarevisited.blogspot.com/2015/08/how-to-find-all-permutations-of-string-java-example.html
▌10.在不使用任何方法库的情况下,如何将一句话中的单词进行反转?
解决方法与代码:
http://www.java67.com/2015/06/how-to-reverse-words-in-string-java.html
▌11.如何判断一个字符串是否为另一个字符串循环移动的结果?
解决方法与代码:
http://www.java67.com/2017/07/string-rotation-in-java-write-program.html
▌12.如何判断一个字符串是否为回文?
解决方法与代码:
http://java67.blogspot.com/2015/06/how-to-check-is-string-is-palindrome-in.html
这些问题有助于提高你对字符串数据结构的理解。如果你在没有外界帮助的情况下,可以解决所有这些字符串问题,那么你的水平已经很棒了。
若想了解更多复杂的问题,建议学习一下《Algorithm Design Manual by Steven Skiena》这本书中的问题,里面大都是难度很高的算法问题。
如果你需要更多的练习,可以参考这一组问题,包含20个字符串编程问题。
问题链接:
到目前为止,我们只涉及了线性数据结构,但现实世界的所有信息都不是以线性的形式展现的,因此出现了树结构。
树结构是一种将数据进行分层存储的数据结构。根据数据存储方式的不同,存在不同类型的树,比如二叉树,其中每个节点至多有两个子节点。
和二叉查找树一样,它们都是最流行的树形式的数据结构。因此,你会发现很多问题基于它们的问题,如计算节点数,如何进行遍历,计算深度,判断它们是否平衡。
解决二叉树问题的关键是要有扎实的知识理论,如什么是二叉树的大小或深度,什么是叶,以及什么是节点。还有对当前流行的遍历算法的理解,如前序遍历、后序遍历和中序遍历。
下面是一系列常在软件开发面试中出现的二叉树热门问题:
▌1.如何部署使用二叉查找树?
解决方法与代码:
▌2.给定一个二叉树,如何进行前序遍历?
解决方法与代码:
▌3.在不使用递归的情况下,如何对给定二叉树进行前序遍历?
解决方法与代码:
http://www.java67.com/2016/07/binary-tree-preorder-traversal-in-java-without-recursion.html
▌4.给定一个二叉树,如何进行中序遍历?
解决方法与代码:
http://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html
▌5.在不使用递归的情况下,如何使用中序遍历输出给定二叉树的所有节点?
解决方法与代码:
http://www.java67.com/2016/08/binary-tree-inorder-traversal-in-java.html
▌6.如何实现后序遍历算法?
解决方法与代码:
http://www.java67.com/2016/10/binary-tree-post-order-traversal-in.html
▌7.在不使用递归的情况下,如何对二叉树进行后序遍历?
解决方法与代码:
http://www.java67.com/2017/05/binary-tree-post-order-traversal-in-java-without-recursion.html
▌8.如何输出一个二叉查找树的所有叶子?
解决方法与代码:
http://www.java67.com/2016/09/how-to-print-all-leaf-nodes-of-binary-tree-in-java.html
▌9.如何计算一个给定二叉树的叶子节点数目?
解决方法与代码:
▌10.给定一个数组,如何对其进行二叉搜索?
解决方法与代码:
如果你觉得自己对二叉树编程的理解还不够,无法独自解决这些问题,我列出了我使用过的书籍:
http://javarevisited.blogspot.sg/2015/07/5-data-structure-and-algorithm-books-best-must-read.html
除了数据结构问题,大多数编程面试也会问有关算法、设计、位操作和一般的逻辑问题,在这部分中我会介绍这些问题。
在实际问题中应用这些概念是十分重要的,因为在面试中它们往往都比较难对付。多加练习不仅可以让你对这些概念更熟悉,也会让你在面试过程中更有信心。
▌1.如何实现冒泡排序算法?
解决方法与代码:
http://javarevisited.blogspot.sg/2014/08/bubble-sort-algorithm-in-java-with.html#axzz5ArdIFI7y
▌2.如何用迭代实现快速排序算法?
解决方法与代码:
▌3.如何实现插入排序算法?
解决方法与代码:
http://www.java67.com/2014/09/insertion-sort-in-java-with-example.html
▌4.如何实现归并排序算法?
解决方法与代码:
http://www.java67.com/2018/03/mergesort-in-java-algorithm-example-and.html
▌5.如何实现桶排序算法?
解决方法与代码:
https://javarevisited.blogspot.com/2017/01/bucket-sort-in-java-with-example.html
▌6.如何实现计数排序算法?
解决方法与代码:
http://www.java67.com/2017/06/counting-sort-in-java-example.html
▌7.如何实现基数排序算法?
解决方法与代码:
http://www.java67.com/2018/03/how-to-implement-radix-sort-in-java.html
▌8.在不使用第三个变量的情况下,如何交换两个数字的值?
解决方法与代码:
http://www.java67.com/2015/08/how-to-swap-two-integers-without-using.html
▌9.如何判断两个矩形是否有重叠?
解决方法与代码:
▌10.如何设计一个自动贩售机?
解决方法与代码:
https://javarevisited.blogspot.com/2016/06/design-vending-machine-in-java.html
推荐阅读:
《Cracking The Code Interview》书中介绍了189个编程问题及解决方法
50个电面编程问题:
http://javarevisited.blogspot.sg/2015/02/50-programmer-phone-interview-questions-answers.html
有关书籍:
https://javarevisited.blogspot.com/2016/06/top-5-books-for-programming-coding-interviews-best.html
练习解决的实际问题越多,准备就越充分。希望这份面试资源对大家有帮忙,面试顺利,都能获得好结果!
原文链接:
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-8cccb36679.css" rel="stylesheet">
视频地址:python之for循环搭配else子句使用陷阱更多精彩内容,敬请扫码关注:
免费的开源飞行规划软件Little Navmap ----https://github.com/albar965/littlenavmap----Little Navmap是一款免费的开源飞行规划器,导航工具,移动地图,机场搜索和飞行模拟器X,Prepar3D和X-Plane的机场信息系统。使用OpenStreetMap作为背景地图的广泛配置的地图显示只是一种选择的许多在线或包含离线地...
最近在网上查资料碰到好多没接触过的技术,先汇总在这里备用,以后慢慢吸收 1. JNAJNI的替代品,调用方式比JNI更直接,不再需要JNI那层中间接口,几乎达到Java直接调用动态库 2. SmallSQL基于JDBC3.0转为Desktop应用设计的嵌入式数据库,纯Java,本地访问,不支持网络但目前好像不太活跃,最新版本是0.2,并且2008年后没有更新 3
匆匆又是一个寒暑,在爆竹声中迎来了新的一年… 算算年纪已经不小了,囊中羞涩,真的感觉不到一点喜庆带来的欣喜。在艰难困苦中度过了一个学期,那曾经向往的大学生活,但没感觉到因自己的节省感到欣慰,更觉得自己的无力。现实的脚步太快,让我追的喘不过气来。 大学的时间真的是太多了,多的我总在想,想的又做不了,真是焦急啊!索性又在问自己人生的目标是什么,却总也想不出一个答案。迷茫是我
Nginx是一款轻量级的web服务器/反向代理服务器,更详细的释义自己百度了。目前国内像新浪、网易等都在使用它。
leetcode 106.从中序与后序遍历序列构造二叉树题目描述根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7解题思路在...
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。使用场景举例:以MySQLInnoDB为例商品goods表中有一个字段s...
【iPhone中文网】iOS9的一大亮点就在于它的省电低功耗模式,苹果官方宣称iOS9上从系统底层对续航进行重新优化,开启省电模式之后,系统的续航待机将延长3个小时。那么,iOS9如何开启/关闭省电模式呢,下面小编就来介绍详细的方法教程,一起来看看吧。iOS9省电模式开启/关闭教程① 依次进入设置>电池;② 将「低电量模式」开关开启即可进入省电模式。省电模式开启后,右上角电池图标会变成黄色,...
课程名称:H5/web全栈开发课程类型:网页设计班型:全日制/周末班/晚班适用校区:全校区课程详情:由于网络的发展以及人们使用网络的频繁性,企业需要通过网页呈现产品、服务、理念、文化,或向大众提供某种功能服务,这也使得网页设计队伍愈加壮大。网页设计是一个不断更新换代、推陈出新的行业,它要求设计师们必须随时把握较新的设计趋势,从而自己不被这个行业所淘汰。1、 无计算机基础,想要从事IT开发的学员;...
灰度图像 f 的低帽变换定义为图像闭运算结果减去原图像。闭运算可以删除亮背景下的暗区域,底帽变换可以得到原图中的暗区域,因此又称黑底帽变换。均匀光照对于从背景中提取目标十分重要。类似地,底帽变换的重要用途也是校正不均匀光照的影响,可以用于删除亮背景下的暗区域,从而得到原图中的暗区域。
静态导入Import static 包名.类名.静态属性|静态方法|*静态导入语句使用import static 语句导入指定类的单个静态属性: import static java.lang.System.out导入指定类静态方法 import static java.lang.Math.max导入指
流操作: 即stream接口针对于集合类提供的操作。集合类.stream()集合获取到stream(流),随之进行自己想要的操作。filter():按照一定条件过滤集合的元素 。 list.stream().filter(x -&gt; x &gt; 5); 像filter()这类返回值为Stream的方法,它其实只是刻画出了stream,并没有产生新的集合,也就是按照规则构造出Stre...