我一直在发布关于 数据结构 和算法的各类面试例题,诸如数组(Array)、队列(Queue)、堆栈(Stack)、二进制树(Binary tree)、链表(LinkedList)、字符串(String)、数字(Number)、动态数组(ArrayList)等等。本文是对我过去发布的这些例题的一份汇总和索引,将来再出新例题时我也会添加到这里。这些题目都是关于数据结构和算法常见的面试问题。
如果你想练习、提升数据结构和算法程序的水平,这篇汇总文章就很值得收藏了。练习这些题目时,我建议读者先自己做一遍再检查答案。
我知道面试中一般不会直接问这些问题,其中有很多题目也很老了,但毕竟它们都是精选出来的好题,可以帮助大家提升编程、算法和解决问题的能力。
编写进栈(push)和出栈(pop)方法来演示堆栈行为(后进先出,Last In First Out)。
解决方案:使用数组实现堆栈的 Java 程序
编写进栈和出栈方法来演示堆栈行为(后进先出)。
解决方案:使用链表实现堆栈的 Java 程序
本题需要使用两个队列来实现堆栈行为。编写进栈和出栈方法来演示 Stack 行为(后进先出)。
解决方案:使用两个队列实现堆栈的 Java 程序
本题需要使用另一个堆栈排序指定堆栈。本题可以使用堆栈的进栈和出栈操作来完成任务。
解决方案:使用另一个堆栈排序指定堆栈
本题需要使用数组来实现队列
解决方案:在 Java 中使用数组实现队列
本题需要使用链表来实现队列。
解决方案:使用链表实现队列的程序
本题需要实现单链表数据结构。编写一个简单的程序来演示插入和删除操作。
解决方案:在 Java 中实现单链表的程序
本题需要编写一个迭代和递归的方案来反转链表。
解决方案:使用 Java 反转链表的程序
本题需要编写一个 Java 程序以最优化的方式查找链表的中间元素。
解决方案:查找链表中间元素的 Java 程序
本题需要编写 Java 程序以最优化的方式查找链表的倒数第 n 个元素。
在问题 9 中,节点 7 就是链表中倒数第 3 个元素。
解决方案:如何从链表中查找倒数第 n 个元素
本题需要编写一个 Java 程序来检测链表中是否存在循环,如果找到循环则需要找到它的起始节点。
解决方案:如何检测链表中的循环
回文是一个单词、短语、数字或其它符号或元素序列,它们正序和倒序读起来是一样的。例如 12121 就是一个回文,因为它正读反读都一样。“madam”也是一个回文。我们需要编写 Java 程序来检查链表是否是回文。
解决方案:用于检查链表是否为回文的 Java 程序
给定两个 单链表 ,检查两个链表是否相交;如果它们相交就找出交集。
解决方案:两个链表的交集
本题需要编写一个 Java 程序来反转成对链表。
解决方案:反转成对链表的 Java 程序
本题需要编写一个 Java 程序实现双链表。
解决方案:Java 中的双链表
本题中会给定一个包含许多数字的数组,需要找出其中最小和最大的元素
解决方案:查找数组中最小和最大元素的 Java 程序
本题会给定一个包含 1 到 n 的整数数组,但少了 1 到 n 中的某个数字。需要提供找到丢失数字的最佳方案。数组中的数字不能重复。
例如:
复制代码
int[] arr1={7,5,6,1,4,2}; Missing number:3(缺少的数字是3) int[] arr2={5,3,1,2}; Missing number:4(缺少的数字是4)
解决方案:在数组中查找缺少的数字
本题会给定一个排序和旋转过的数组,如下所示:
复制代码
intarr[]={16,19,21,25,3,5,8,10};
如果你发现数组已做过排序和旋转,就要在 o(log n) 的时间复杂度内搜索上述数组中的元素。
解决方案:在已旋转和排序的数组中搜索元素
本题会给定一个已排序和旋转的数组,如下所示:
复制代码
intarr[]={16,19,21,25,3,5,8,10}; Minimum elementinthearray:3(数组中最小的元素是3)
如果你发现数组已做过排序和旋转,就要在 o(log n) 的时间复杂度内找出数组中的最小元素。
解决方案:在已排序和旋转的数组中查找最小元素
本题会给定一个已排序和旋转过的数组,如下所示:
复制代码
int[] arr1={7,5,6,1,4,2}; Second largest elementinthearray:6(数组中第二大的元素是6)
解决方案:查找数组中第二大数字的 Java 程序
本题会给定一个整数数组,其中所有数字都会出现偶数次,只有一个例外。本题需要找到出现奇数次数的数字,方案限定在 o(n) 的时间复杂度和 o(1) 的空间复杂度内。
复制代码
intarray[] = newint[]{20,40,50,40,50,20,30,30,50,20,40,40,20}; Number which occurs odd number of timesis:50(出现奇数次的数字是50)
解决方案:查找数组中出现奇数次数字的 Java 程序
本题会给定前往特定车站列车的到达和离开时间。需要找到在任意时间点上车站所需的最小站台数量。
复制代码
arrival[] = {1:00,1:40,1:50,2:00,2:15,4:00} departure[] = {1:10,3:00,2:20,2:30,3:15,6:00} No. of platforms requiredinabove scenario =4(上述情况下需要的最少站台数为4)
请注意,列车到达时间按时间顺序排列。
解决方案:找到火车站所需的最少站台数量
给定一个包含正负整数的数组,需要找出数组中和最接近零的整数对。
复制代码
array[]={1,3,-5,7,8,20,-40,6}; The pair whose sumisclosest to zero:-5and6(和最接近零的整数对是-5和6)
解决方案:使用 Java 在数组中找出和最接近零的元素对
给定一个已排序数组,我们需要找到数组中和最接近数字 X 的元素对。
复制代码
array[]={-40,-5,1,3,6,7,8,20}; The pair whose sumisclosest to5:1and3(这里和最接近5的元素对是1和3)
解决方案:使用 Java 在数组中找到和最接近 X 的元素对
给定一个数组,我们需要找到和等于数 X 的所有元素对。
复制代码
array[]={-40,-5,1,3,6,7,8,20}; Pair of elements whose sumisequal to15:7,8and-5,20(和等于15的元素对有7和8、-5和20)
解决方案:查找数组中和等于给定数字的所有元素对
复制代码
arr[] = {0,1,0,0,1,1,1,0,1} Array after separating0and1numbers(将0和1分开后数组变为): {0,0,0,0,1,1,1,1,1}
解决方案:在数组中分离 0 和 1
给定一个整数数组,需要在数组中分离奇数和偶数。
请注意,元素顺序可以改动。
复制代码
arr[] = {12,17,70,15,22,65,21,90} Array after separating oddandeven numbers(分离奇偶数后数组变为): {12,90,70,22,15,65,21,17}
解决方案:在数组中分离 0 和 1
复制代码
Input: [1,2,2,0,0,1,2,2,1] Output: [0,0,1,1,1,2,2,2,2]
解决方案:对只有 0、1 和 2 的数组排序
局部最小元素比其旁边的元素都小
复制代码
Input: int[] arr = {10,5,3,6,13,16,7}; Output:3 int[]arr = {11,12,13,14}; Output:11 int[]arr = {10}; Output:10 int[]arr = {8,6}; Output:6
解决方案:在数组中查找局部最小元素
给定一个整数数组和一个整数 k,从所有大小为 K 的连续子数组中找出最大元素。
复制代码
Input: Input:int[] arr = {2,6,-1,2,4,1,-6,5} intk =3 output:6,6,4,4,4,5
解决方案:使用 Java 找到滑动窗口的最大值
给定包含重复项的整数排序数组。找出数组中存在的每个元素的频率。
频率定义为数组中元素的出现次数。
例如:
复制代码
Input: Input: int[] arr = {1,1,1,3,3,4,5,5,6,6}; Output: Frequency of1is:3(数字1的频率为3) Frequency of3is:2 Frequency of4is:1 Frequency of5is:2 Frequency of6is:2
解决方案:计算已排序数组中每个元素的出现次数或称频率
给定一个非负整数数组和一个数字。需要打印和等于给定整数的子数组的所有起始和结束索引。
复制代码
Input: Input-int[] arr = {2,3,6,4,9,0,11}; intnum =9 Output- starting index:1, Ending index:2 starting index:5, Ending index:5 starting index:5, Ending index:6
解决方案:在数组中查找等于给定和的子数组
数组中的峰值元素大于等于邻近元素,即对于索引中 i 处的元素,索引 i-1 和 i+1 处的邻近元素必须小于等于前者。
解决方案:在数组中查找峰值元素
我们需要打印数组中的所有 leader。Leader 元素大于它右侧的所有元素。
复制代码
arr[]={14,12,70,15,99,65,21,90} Here99and90are leader elements(99和90是 leader 元素)
解决方案:在数组中查找 leader
在给定的已排序二进制数组中打印数字 1 的数量。
复制代码
Input: int[] arr = {0,0,0,1,1,1,1}; output:4 int[] arr = {0,0,1}; output:1
解决方案:在已排序的二进制数组中对数字 1 计数
找到整数数组中的第一个重复元素。
例如:
复制代码
Input: Input:array[] = {10,7,8,1,8,7,6} Output:7[7isthe first element actually repeats(7是第一个重复元素)]
解决方案:在整数数组中查找第一个重复元素
给定一个数组,我们需要检查数组是否是连续元素。
复制代码
Input:array[] = {5,3,4,1,2} Output:true Asarraycontains consecutive elementsfrom1to5(数组中有1到5的连续元素) Input:array[] = {47,43,45,44,46} Output:true Asarraycontains consecutive elementsfrom43to47 Input:array[] = {6,7,5,6} Output:false Asarraydoesnotcontain consecutive elements.(数组中没有连续元素)
解决方案:检查数组元素是否连续
给定包含不同整数的数组,打印数组的所有排列。
复制代码
array: [10,20,30] Permuations are: [10,20,30] [10,30,20] [20,10,30] [20,30,10] [30,10,20] [30,20,10]
解决方案:Java 中数组的排列
问题 39:在 K 位置旋转数组。
复制代码
N=6andk=2 If Arr[] = {1,2,3,4,5,6}andk=2 then rotatedarraywill be {5,6,1,2,3,4}
[解决方案:按 K 位置旋转数组 ( https://java2blog.com/rotate-array-by-k-positions/ )
给定整数数组,元素代表某日股价,找出一次交易可获得的最大利润。
所以需要找出(买入日,卖出日)的元素对,买入日值小于等于卖出日值,并最大化利润。
复制代码
intarr[]={14,12,70,15,99,65,21,90}; Max profit can be gain by buying at1th day(0based indexing)andsell at4th day.(第一天买入第四天卖出利润最大) Max profit =99-12=87
解决方案:股票买卖的利润最优策略
给定整数数组,找出后面较大元素与前面较小元素的最大差值
复制代码
intarr[]={14,12,70,15,95,65,22,30}; Max Difference =95-12=83
解决方案:找出数组中后面较大元素与前面较小元素的最大差值
给定按行和按列排序的矩阵,需要以最小的时间复杂度搜索元素。
解决方案:在按行和按列排序的矩阵中搜索
在一维数字数组内找到和最大的连续子数组。
复制代码
forthe sequence of values −2,1, −3,4, −1,2,1, −5,4; the contiguous subarray with the largest sumis4, −1,2,1, with sum6
解决方案:和最大的连续子数组
给定正整数数组和值 X,找到其和等于 X 的连续子数组。
复制代码
arr[]={14,12,70,15,99,65,21,90}; X =97. Sum found between index1to3 Elements are12,17and15
解决方案:在数组中找到和为给定值的连续子数组
给定字符串数组,找出最长的公共前缀。
复制代码
字符串 [] strArr={"java2blog","javaworld","javabean","javatemp"}; So Longest commonprefixinabove 字符串 array will be “java” as all above string starts with “java”. 最长的公共前缀是“java”。
解决方案:使用 Java 找出字符串数组中最长的公共前缀
给定一组不同整数的集合,返回所有可能的子集(幂集)。
复制代码
Input: nums = [1,2,3] Output: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
解决方案:使用 Java 查找集合的所有子集
解决方案:有很多方法,例如
参考” 使用 Java 反向字符串 “
解决方案:如果两个字符串有相同的字符但顺序不同,它们就是变位词,如 Angel 和 Angle。
有几种方法,如
参考“ 使用 Java 检查两个字符串是否是变位词 ”
解决方案:可以用以下方法
完整解决方案参考“ 检查字符串是否只包含独立字符 ”
解决方案:假设要检查 str1 和 str2 是否相互旋转。
完整方案参考“ 使用 Java 检查一个字符串是否是另一个的旋转 ”
参阅“ 查找字符串中的重复字符 ”
参考“ 使用 Java 查找字符串中第一个非重复字符 ”
例如,如果输入为“abb”,则输出应为“a”,“b”,“b”,“ab”,“bb”,“abb”
我们使用字符串类的 subString 方法来查找所有子字符串。
参考“ 查找字符串的所有子字符串 ”
解决方案:本题可以使用 try catch 块来捕获 StringIndexOutOfBoundException,出现此异常时可以简单地返回 i(出现异常的索引)
参考“ 不使用任何 Java 内置方法查找字符串的长度 ”
解决方案:取出字符串的第一个字符插入字符串剩余排列的每个位置,做递归。
参考“ 使用 Java 打印字符串的所有排列 ”
遍历二叉树有三种方法。
可以使用队列数据结构。
解决方案:二叉树的层序遍历
解决方案:二叉树的螺旋顺序遍历
上图中二叉树的叶节点是 5、30、55、70
解决方案:打印二叉树的叶节点
问题 59 中使用的二叉树的叶节点数为 4。
解决方案:对二叉树的叶节点计数
解决方案:打印二叉树中从根到叶的所有路径
给定一个节点,需要找到节点的级别。例如:问题 61 中节点 70 的级别为 3。
解决方案:在二叉树中查找节点级别
解决方案:在二叉树中查找最大元素
解决方案:在二叉树中查找 LCA
如下图所示。
解决方案:二叉树的边界遍历
本题需要找到位于同一列中的节点之和。
解决方案:如何打印二叉树的垂直和
给定二叉树和整数。本题需要找到所有节点和等于给定整数的子树数量。
解决方案:在二叉树中计算和等于给定值的子树数量
 
二叉搜索树是一种特殊类型的二叉树,具有以下属性。
解决方案:在二叉搜索树中插入节点
解决方案:删除二叉搜索树中的节点
解决方案:二叉搜索树的最左侧和最右侧节点分别是最小和最大节点
解决方案:在二叉搜索树中查找 LCA
解决方案:二叉搜索树的中序后继
解决方案:将已排序的排序数组转换为平衡二叉搜索树
解决方案:将已排序的链表转换为平衡二叉搜索树
解决方案:使用 Java 检查二叉树是否为二叉搜索树
解决方案:Java 中的冒泡排序
解决方案:Java 的插入排序
解决方案:Java 的选择排序
解决方案:Java 的合并排序
解决方案:Java 的堆排序
解决方案:使用 Java 实现快速排序
解决方案:使用 Java 实现希尔排序
解决方案:使用 Java 实现计数排序
解决方案:Java 中的二分搜索算法
解决方案:Java 中的深度优先搜索
解决方案:Java 中的广度优先搜索
解决方案:Java 中的 Dijkstra 算法
解决方案:Java 中的 Bellman ford 算法
解决方案:Kruskal 算法
解决方案:使用 Java 查找最长公共子字符串
解决方案:Java 中的最长公共子序列
解决方案:计算矩阵中的所有路径
给定两个字符串 String1 和 String2,用给定操作以最小步数将 String1 转换为 String2。使用任何一个给定操作都会增加步数。
给定操作有:
解决方案:Java 中的编辑距离问题
解决方案:Java 中的找零问题
解决方案:到达最后一个索引的最小跳转次数
解决方案:如何计算算法的复杂度
解决方案:使用 Java 实现 trie 数据结构
解决方案:使用 Java 计算 n 阶乘末尾 0 的个数
解决方案:计算直方图中的最大矩形区域
解决方案:检查 Java 中表达式的平衡括号
记忆化是将结果存储在数据结构中(通常是 Hashtable 或 HashMap 或数组),确保方法不会对同一输入执行多次。
Java 中的记忆化示例
这都是关于数据结构和算法面试问题的问题。读者可能还喜欢下列文章:
查看英文原文: https://hackernoon.com/top-100-data-structure-and-algorithms-interview-questions-for-practice-d5071e92321e
Arpit Mandliya 是一位 Java 博主、极客、梦想家! 网站 Java2blog.com 的作者