数据结构面试题整理

article/2025/10/16 0:45:34

一 数据结构

1.你熟悉什么数据结构?
数组 链表
栈 队列 哈希
二叉树 二叉查找树 二叉堆
b树 b+树

2.b树 b+树 b*树
b和b+都是节点可以有很多子节点,区别是b树所有的节点都可以存储关键字,而b+树只有叶子节点存储关键字,适用于数据库索引。

3.树的中序遍历

在这里插入图片描述

4.二叉平衡树,怎么用一维数组存储
在这里插入图片描述
使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或者右孩子空缺,则数据的相应位置也空出来。

设计思路:

假设一个父节点的下标是p
左孩子下标=2p +1
右孩子下标=2
p+2

反过来,左孩子的下标是l,它父节点下标为:(l - 1)/2

二 算法

1.快排?快排的实现过程?复杂度如何?简单代码实现?
方式:
双边循环法(代码实现复杂)
单边循环法(推荐)

复杂度:
nlogn

单边循环法实现过程
1-先找到一个基准元素,起始下标
2-遍历,如果元素比基准元素小,下标+1
此元素与下标对应元素交换位置
3-当遍历完后,基准元素与当前下标元素交换位置,此时基准元素就分成了两组数据
4-两边的数据在递归调用,分而治之,直到起始下标和终止下标结束,则不能在拆分
5-遍历数组元素即可

单边循环法代码实现:

public static void quickSort(int[] arr, int startIndex, int endIndex) 
{ 
// 递归结束条件:startIndex大于或等于endIndex时 if (startIndex >= endIndex) { return;} // 得到基准元素位置 int pivotIndex = partition(arr, startIndex, endIndex); // 根据基准元素,分成两部分进行递归排序quickSort(arr, startIndex, pivotIndex - 1); quickSort(arr, pivotIndex + 1, endIndex); 
} /** * 分治(单边循环法) * @param arr 待交换的数组 * @param startIndex 起始下标* @param endIndex 结束下标 */ 
private static int partition(int[] arr, int startIndex, int endIndex) { // 取第1个位置(也可以选择随机位置)的元素作为基准元素int pivot = arr[startIndex]; int mark = startIndex; for(int i=startIndex+1; i<=endIndex; i++){ if(arr[i]<pivot){ mark ++;int p = arr[mark]; arr[mark] = arr[i];arr[i] = p; }
}arr[startIndex] = arr[mark]; arr[mark] = pivot; return mark; } public static void main(String[] args) { int[] arr = new int[] {4,4,6,5,3,2,8,1}; quickSort(arr, 0, arr.length-1); System.out.println(Arrays.toString(arr)); }

说明:
递归代码的书写特点,先找到一个循环的代码,在找出跳出循环的条件,递归的调用循环代码。

2.二分查找原理,简单的一个代码
算法思想:
设置开始位置start,结束位置end,以及中间位置 mid=(end+start)/2,
如果arr[index]=mid,返回mid
如果arr[index]>mid,从后半段查找,将start设置为mid+1
如果arr[index]<mid,从后半段查找,将end设置为mid-1
如果start>end,返回-1,说明所查元素不存在

代码:

public class Select1_SuanFa2 {public static void main(String[] args) {		System.out.println(select(44));	}	public static int select(int target) {		//定义数组		int[] arr = {21,32,36,44,45,36,47,38,29};		//定义初始位置		int start = 0;		//定义结束位置		int end = arr.length-1;		//定义中间位置		int mid = (start+end)/2;	while(true) {			//如果没有这个元素,则start>=end,返回-1			if(start>end) {		 	return -1;			}			//判断是否和中间位置元素值相等			if(arr[mid] == target) {				//将中间位置的索引赋值给目标位置				return mid;			}else {				if(arr[mid] > target) {					//将end位置设置为中间位置减一					end = mid-1;				}else {					//将start位置设置为中间位置加1					start = mid+1;				}				//取出新的中间位置(别忘记了)				mid = (start+end)/2;			}		}					}    }

3.怎么判断链表是否有环?
在这里插入图片描述

思路:
两个指针分别按照固定步长行走,P1一次走1布,P2一次走2布,如果链表有环,P1和P2会有相遇的时刻。(追击问题解法)

代码:

/** * 判断是否有环 * @param head 链表头节点 
*/ public static boolean isCycle(Node head) { 
Node p1 = head; Node p2 = head; 
while (p2!=null && p2.next!=null){ ;p1 = p1.next; p2 = p2.next.next; if(p1 == p2){ return true; 
} 
return false; } /** * 链表节点 */ 
private static class Node { 
int data; 
Node next;
Node(int data) { this.data = data; 
} 
} public static void main(String[] args) throws Exception { 
Node node1 = new Node(5); Node node2 = new Node(3); Node node3 = new Node(7); Node node4 = new Node(2); Node node5 = new Node(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node2; System.out.println(isCycle(node1)); } 

4.链表的定义,怎么实现链表翻转?
链表翻转代码参考: https://blog.csdn.net/xu491361421xiao/article/details/81385435

5.怎么求数组的最大子序列和

6.栈中最小值
在这里插入图片描述
在这里插入图片描述
代码如下:

private Stack<Integer> mainStack = new Stack<Integer>(); 
private Stack<Integer> minStack = new Stack<Integer>(); /** * 入栈操作 * @param element 入栈的元素 */ 
public void push(int element) { mainStack.push(element); //如果辅助栈为空,或者新元素小于或等于辅助栈栈顶,则将新元素压入辅助栈 if (minStack.empty() || element <= minStack.peek()) { minStack.push(element); } } /** * 出栈操作 */ public Integer pop() { //如果出栈元素和辅助栈栈顶元素值相等,辅助栈出栈 
if (mainStack.peek().equals(minStack.peek())) { 
minStack.pop(); 
}return mainStack.pop(); } /** * 获取栈的最小元素 */ public int getMin() throws Exception { if (mainStack.empty()) { throw new Exception("stack is empty"); } return minStack.peek(); } public static void main(String[] args) throws Exception { MinStack stack = new MinStack(); stack.push(4); stack.push(9); stack.push(7); stack.push(3); stack.push(8); stack.push(5); System.out.println(stack.getMin()); 
stack.pop(); stack.pop(); 
stack.pop(); 
System.out.println(stack.getMin()); }

http://chatgpt.dhexx.cn/article/VRV56l4i.shtml

相关文章

数据结构与算法三十题,弄懂这些面试就够了!

https://www.toutiao.com/a6649963989537128967/ 2019-01-24 15:36:35 国外 IT 教育学院 Educative.io 创始人 Fahim ul Haq 写过一篇过万赞的文章《The top data structures you should know for your next coding interview》,总结了程序员面试中需要掌握的 8 种数据结构知识…

数据结构与算法面试知识点汇总(超全)

文章目录 一、哈希函数和哈希表01 哈希函数02 哈希表 二、布隆过滤器三、一致性哈希四、并查集01 具体实现02 优化03 代码实现 五、前缀树&#xff08;trie树&#xff09;六、B树和B树七、线段树01 线段树的优势02 线段树实现 一、哈希函数和哈希表 01 哈希函数 哈希函数&…

《数据结构》十道链表经典面试题多种方法深度解析

目录 ⛰️一、题目解析 &#x1f5fb;1.1删除链表中等于给定值 val 的所有节点&#xff08;力扣&#xff09; &#x1f5fb;1.2反转一个单链表。&#xff08;力扣&#xff09; &#x1f5fb;1.3给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有…

数据结构和算法常见面试问题总结,含答案

0. 写在前面 总导航在此 这些问题是我备考数据结构和算法的过程中&#xff0c;详细总结的常见面试问题和答案。逐个搜索并记录下来&#xff0c;花了很大的精力&#xff01;如果想要获取源文件的话&#xff0c;可以关注我的微信公众号&#xff1a;小梁说代码&#xff0c;获取嘿…

(六)数据结构面试必问

什么是链表、队列、栈&#xff1f; 链表&#xff1a; 当需要存储多个相同数据类型的时候&#xff0c;可以使用数组存储&#xff0c;数组可以通过下标直接访问&#xff0c;但数组有个缺点就是无法动态的插入或删除其中的元素&#xff08;特别是操作第一个位置上的元素&#xff…

数据结构常见面试题

链表是最基本的数据结构&#xff0c;面试官也常常用链表来考察面试者的基本能力&#xff0c;而且链表相关的操作相对而言比较简单&#xff0c;也适合考察写代码的能力。链表的操作也离不开指针&#xff0c;指针又很容易导致出错。综合多方面的原因&#xff0c;链表题目在面试中…

面试中常见的数据结构

上次在面试时被面试官问到学了哪些数据结构&#xff0c;那时简单答了栈、队列/(ㄒoㄒ)/~~其它就都想不起来了&#xff0c;今天有空整理了一下几种常见的数据结构&#xff0c;原来我们学过的数据结构有这么多~ 首先&#xff0c;先来回顾下C语言中常见的基本数据类型吧O(∩_∩)O …

数据结构算法常见面试考题

&#xff08;1&#xff09; 红黑树的了解&#xff08;平衡树&#xff0c;二叉搜索树&#xff09;&#xff0c;使用场景 把数据结构上几种树集中的讨论一下&#xff1a; 1.AVLtree 定义&#xff1a;最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为…

八大数据结构及常见面试题

几乎所有的问题都需要面试者对数据结构有深刻的理解。无论你是初入职场的新兵(刚从大学或者编程培训班毕业)&#xff0c;还是拥有几十年经验的职场老鸟。 即便是对于一些非常基础的工作来说&#xff0c;学习数据结构也是必须的。那么&#xff0c;就让我们先从一些基本概念开始入…

数据结构面试、数据结构考研复试——常见问题以及回答

说明&#xff1a;这些是自己整理回答的答案 可以借鉴 也可能存在错误 欢迎指正 文章目录 逻辑结构与物理结构的区别算法常见的数据结构链表存储结构和顺序存储结构的区别数组和链表的区别头指针和头结点的区别线性链表判断整个链表是否有环&#xff0c;如何找到这个环单链表和…

架构设计分布式数据结构与算法面试题(2020最新版)

Java面试总结&#xff08;2021优化版&#xff09;已发布在个人微信公众号【技术人成长之路】&#xff0c;优化版首先修正了读者反馈的部分答案存在的错误&#xff0c;同时根据最新面试总结&#xff0c;删除了低频问题&#xff0c;添加了一些常见面试题&#xff0c;对文章进行了…

数据结构面试题以及答案整理

参考网络整理的一些问题 一、什么是数据结构&#xff1f; 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。结构包括逻辑结构和物理结构。 数据的逻辑结构包括4种 (1)集合&#xff1a;数据元素之间除了有相同的数据类…

数据结构面试常见问题总结

数据结构面试常见问题总结 写在前面 本文记录了一些数据结构面试常见问题&#xff0c;本意用于考研复试&#xff0c;以下面试题为网上整理的问题以及自己加入的一些问题&#xff0c;答案仅供参考&#xff01; Q&#xff1a;数据结构三要素 A&#xff1a;逻辑结构、物理结构、…

mysql 驱动包 mysql-connect-java

mysql的驱动包 mysql-connect-java 内部封装了jdbc: jdbc(java database connectivity):本身是由一组接口组成 , 可以使得Java编译来访问各种数据库无需自己实现接口,这些接口的实现类由第三方数据库厂商实现 jdbc的核心 接口或类作用DriverManager类创建数据库的连接Conne…

Mysql 驱动包mysql-connector-java-8.0.25.jar下载

安装地址 https://downloads.mysql.com/archives/c-net/ 按需选择所需版本&#xff0c;点击Download即可下载&#xff1b; 网盘下载地址&#xff1a; 需要的小伙伴&#xff0c;请关注微信公众号: Transkai, 或者扫描下方公众号二维码&#xff0c;回复关键字&#xff1a;mysql驱…

下载MySQL驱动程序

下载步骤&#xff1a; 第一步&#xff1a;进入MySQL官方网站&#xff0c;并选择DOWNLOADS和Community。 第二步&#xff1a;选择MySQL Connectors 第三步&#xff1a;选择Connector/J 第四步&#xff1a;进入下面界面&#xff0c;找到下面的Generally available (GA)…

【java】Java连接mysql数据库及mysql驱动jar包下载和使用

文章目录 JDBCJDBC本质&#xff1a;JDBC作用&#xff1a;跟数据库建立连接发送 SQL 语句返回处理结果 操作流程和具体的连接步骤如下&#xff1a;操作步骤&#xff1a;需要导入驱动jar包 mysql-connector-java-8.0.22.jar注册驱动获取数据库连接对象 Connection定义sql获取执行…

Mysql-connector-java驱动包(最新版下载详细教程)

步骤如下&#xff1a; 1.进入下载官网 https://dev.mysql.com/downloads/ 2.点击Connector/J 3.选platform Independent选项 4.选zip 5.选择不登陆进行下载 6.自己选择下载到哪个文件夹即可下载成功

Java连接MySQL mysql-connector-java-bin.jar驱动包的下载与安装

eclipse在连接mysql数据库的时候要通过mysql驱动包进行连接 首先进入官网中----官网地址&#xff1a;https://dev.mysql.com/ 进入官网中选择DOWNLOADS&#xff08;下载&#xff09; 2. 选择下载中的mysql-connectors 3. 选择connector/J J指的是Java 4.接下在选择操作系统…

Java连接mysql数据库及mysql驱动jar包下载和使用(详细记录)

JDBC 基本概念&#xff1a;java 数据库连接&#xff0c;简称&#xff1a;&#xff08; java DataBase Connectivity &#xff09;&#xff0c;java语言操作数据库。 JDBC本质&#xff1a; 其实是官方&#xff08;SUN公司&#xff09;定义的一套操作所有关系型数据库的规则&…