数据结构面试问题

数据结构是计算机科学中一个非常重要的基础知识,在面试中也经常会被问到。本文将详细介绍几种常见数据结构的面试题,并给出代码示例,希望对大家准备面试有所帮助。

一、数组和字符串

1. 如何反转一个字符串?

最简单的方法是使用双指针,一个指向字符串开头,一个指向结尾,然后不断交换两个指针指向的字符,并向中间移动,直到两指针相遇。示例代码如下:

public void reverseString(char[] s) {int left = 0, right = s.length - 1;while (left < right) {char temp = s[left];s[left++] = s[right];s[right--] = temp;}
}

时间复杂度为O(n),空间复杂度为O(1)。

2. 如何判断一个字符串是否为回文串?

同样可以使用双指针,一个指向开头,一个指向结尾,然后比较两个指针指向的字符是否相等,并向中间移动,直到两指针相遇或者不相等。示例代码如下:

public boolean isPalindrome(String s) {int left = 0, right = s.length() - 1;while (left < right) {while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {left++;}while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {right--;}if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {return false;}left++;right--;}return true;
}

注意要先过滤掉非字母和数字的字符,然后统一转换为小写再比较。时间复杂度为O(n),空间复杂度为O(1)。

二、链表

1. 如何判断一个链表是否有环?

可以使用快慢指针,快指针每次走两步,慢指针每次走一步,如果链表中存在环,则快慢指针一定会相遇。示例代码如下:

public boolean hasCycle(ListNode head) {if (head == null || head.next == null) {return false;}ListNode slow = head;ListNode fast = head.next;while (slow != fast) {if (fast == null || fast.next == null) {return false;}slow = slow.next;fast = fast.next.next;}return true;
}

时间复杂度为O(n),空间复杂度为O(1)。

2. 如何找到链表的中间节点?

同样可以使用快慢指针,快指针每次走两步,慢指针每次走一步,当快指针走到链表末尾时,慢指针刚好在中间节点。示例代码如下:

public ListNode middleNode(ListNode head) {ListNode slow = head, fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;}return slow;
}

时间复杂度为O(n),空间复杂度为O(1)。

三、栈和队列

1. 如何用栈实现队列?

可以用两个栈来模拟队列,一个栈用于入队,一个栈用于出队。入队时,直接将元素压入入队栈;出队时,如果出队栈为空,则将入队栈中的所有元素弹出并压入出队栈,然后从出队栈弹出元素。示例代码如下:

class MyQueue {private Stack<Integer> inStack;private Stack<Integer> outStack;public MyQueue() {inStack = new Stack<>();outStack = new Stack<>();}public void push(int x) {inStack.push(x);}public int pop() {if (outStack.isEmpty()) {while (!inStack.isEmpty()) {outStack.push(inStack.pop());}}return outStack.pop();}public int peek() {if (outStack.isEmpty()) {while (!inStack.isEmpty()) {outStack.push(inStack.pop());}}return outStack.peek();}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}
}

入队操作的时间复杂度为O(1),出队操作的均摊时间复杂度也为O(1)。

2. 如何用队列实现栈?

可以用两个队列来模拟栈,一个队列用于存储元素,一个队列用于辅助。入栈时,将元素加入非空的队列;出栈时,将非空队列中除最后一个元素外的所有元素依次出队并加入另一个队列,然后将最后一个元素出队并返回。示例代码如下:

class MyStack {private Queue<Integer> queue1;private Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}public void push(int x) {if (!queue1.isEmpty()) {queue1.offer(x);} else {queue2.offer(x);}}public int pop() {if (!queue1.isEmpty()) {while (queue1.size() > 1) {queue2.offer(queue1.poll());}return queue1.poll();} else {while (queue2.size() > 1) {queue1.offer(queue2.poll());}return queue2.poll();}}public int top() {if (!queue1.isEmpty()) {while (queue1.size() > 1) {queue2.offer(queue1.poll());}int res = queue1.poll();queue2.offer(res);return res;} else {while (queue2.size() > 1) {queue1.offer(queue2.poll());}int res = queue2.poll();queue1.offer(res);return res;}}public boolean empty() {return queue1.isEmpty() && queue2.isEmpty();}
}

入栈操作的时间复杂度为O(1),出栈操作的时间复杂度为O(n)。

四、二叉树

1. 如何判断一棵二叉树是否对称?

可以递归地判断左右子树是否镜像对称。如果左右子树都为空,则对称;如果只有一个子树为空或者两个子树的根节点值不相等,则不对称;否则递归判断左子树的左子树和右子树的右子树是否对称,以及左子树的右子树和右子树的左子树是否对称。示例代码如下:

public boolean isSymmetric(TreeNode root) {if (root == null) {return true;}return isSymmetric(root.left, root.right);
}private boolean isSymmetric(TreeNode left, TreeNode right) {if (left == null && right == null) {return true;}if (left == null || right == null || left.val != right.val) {return false;}return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left);
}

时间复杂度为O(n),空间复杂度为O(h),其中h为二叉树的高度。

2. 如何判断一棵二叉树是否为二叉搜索树?

二叉搜索树的性质是左子树的所有节点值都小于根节点值,右子树的所有节点值都大于根节点值。因此,可以在中序遍历的过程中判断当前节点值是否大于前一个节点值。示例代码如下:

public boolean isValidBST(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode pre = null;while (root != null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}root = stack.pop();if (pre != null && root.val <= pre.val) {return false;}pre = root;root = root.right;}return true;
}

时间复杂度为O(n),空间复杂度为O(h),其中h为二叉树的高度。

以上就是几种常见数据结构的面试题和代码示例,希望对大家有所帮助。在面试中,除了要掌握这些基本数据结构的特点和操作外,还要学会灵活运用,举一反三。同时,也要注重代码的完整性、鲁棒性和可读性,这样才能给面试官留下良好的印象。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 18.04安装最新版Visual Studio Code(VS Code)报依赖库版本过低错误

Ubuntu 18.04安装最新版Visual Studio Code&#xff08;VS Code&#xff09;报依赖库版本过低错误 1. 问题描述2. 解决方案2.1 修复之前安装的错误2.2 安装VS Code 1.85.2 3. 原因分析 1. 问题描述 在Ubuntu 18.04系统上安装VS Code ≥ v1.86.2&#xff08;测试到v1.87.1&…

laravel 模型多对多,应用

laravel 模型多对多&#xff0c;应用&#xff0c;试卷 跟 区域 多对多关系 一个试卷可以发放到a b c 区域 创建试卷表 CREATE TABLE exams (exam_id int(11) unsigned NOT NULL AUTO_INCREMENT,exam_title varchar(100) NOT NULL DEFAULT COMMENT 标题,created_time int(11…

考虑局部遮阴的光伏PSO-MPPT控制MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 简介 光伏电池阵列的输出特性曲线不是线性变化的。当光伏电池遮荫时&#xff0c;产生的功 率会不断变化&#xff0c;致使光伏电池阵列的输出功率不断变化&#xff0c;其输出特性曲线呈现多峰值的现象。 多峰…

【漏洞复现】Linksys E2000 position.js 身份验证绕过漏洞(CVE-2024-27497)

0x01 产品简介 Linksys E2000是一款由思科&#xff08;Cisco&#xff09;品牌推出的无线路由器&#xff0c;它是一款支持2.4GHz和5GHz双频段的无线路由器&#xff0c;用户可以避开拥挤的2.4GHz频段&#xff0c;独自享受5GHz频段的高速无线生活。 0x02 漏洞概述 Linksys E200…

Jmeter 使用教程(小白一学就会)

下载 官网下载地址 解压 zip 打开 进入 jmeter 的 bin 目录下mac 电脑启动&#xff0c;执行以下命令&#xff08;注意 windows 使用 jmeter.bat 启动&#xff09; ./jmeter打开成功 修改为中文 创建测试计划 添加线程组 修改线程属性 在线程组添加 HTTP 请求 设置 Web…

golang数组和Slice地址

var nameList [56]string // 数组指针地址与数据第一个值地址相同 fmt.Printf("nameLists数组的内存地址为%p\n", &nameList) fmt.Printf("nameList数组中第一个元素的地址为%p\n", &nameList[0]) fmt.Printf("nameList数组中第二个元素的地址…

深入理解MySQL中的MVCC(多版本并发控制)

在MySQL中&#xff0c;MVCC是一种用于提供并发控制的技术&#xff0c;它允许数据库系统在事务并发执行的情况下保持数据的一致性&#xff0c;同时提高了数据库的并发性能。MVCC背后的理念是允许每个事务可以看到一个一致性的快照&#xff0c;从而避免了读取操作被写入操作所阻塞…

Spring之BeanFactory与FactoryBean的区别

BeanFactory BeanFactory是Spring中工厂的顶层接口&#xff0c;也是IOC容器的核心接口&#xff0c;BeanFactory中定义了管理Bean的通用方法&#xff0c;职责包括实例化、定位、配置应用程序中的对象以及建立这些对象的依赖。BeanFactory只是一个接口&#xff0c;并不是IOC容器…

DDR3 NATIVE接口

参考&#xff1a; DDR3 控制器 MIG IP 详解完整版 &#xff08;native&Vivado&Verilog&#xff09;_mig ip核-CSDN博客 APP和AXI接口有许多相似的地方&#xff08;握手部分&#xff09;&#xff0c; 但是由于和物理芯片直接相关&#xff0c;有更多不一样的地方。 a…

Python算法题集_搜索二维矩阵

Python算法题集_搜索二维矩阵 题74&#xff1a;搜索二维矩阵1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【矩阵展开为列表二分法】2) 改进版一【行*列区间二分法】3) 改进版二【第三方模块】 4. 最优算法5. 相关资源 本文为Python算法题集之…

c++中string的使用!!!(适合初学者 浅显易懂)

我们先初步的认识一下string,string底层其实是一个模版类 typedef basic_string<char> string; 我们先大致的把string的成员函数列举出来 class string { private: char * str; size_t size; size_t capacity; }; 1.string的六大默认函数 1.1 构造函数、拷贝构造 注&am…

基础刷题50之四(有效的字母异位词)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解1、排序2、哈希表 三、文心一言解释1、排序2、哈希表 总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没…

动态规划(算法竞赛、蓝桥杯)--数位DP--Windy树

1、B站视频链接&#xff1a;E37 数位DP Windy数_哔哩哔哩_bilibili 题目链接&#xff1a;[SCOI2009] windy 数 - 洛谷 #include <bits/stdc.h> using namespace std; const int N 12; int a[N]; //把整数的每一位数字抠出来&#xff0c;存入数组 int f[N][10]; /…

代码随想录算法训练营第36天—动态规划04 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

01背包 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1cg411g7Y6 常见的背包问题类型&#xff08;大厂面试重点掌握01背包和完全背包即可&#xf…

LeetCode-1944题: 队列中可以看到的人数(原创)

【题目描述】 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 。更正式的&…

能量不等式证明

波动方程初值问题能量不等式的证明 Gronwall 不等式 若非负函数 G ( τ ) G(\tau) G(τ) 在 [ 0 , T ] [0,T] [0,T] 上连续可微&#xff0c; G ( 0 ) 0 G(0)0 G(0)0&#xff0c;且对 τ ∈ [ 0 , T ] \tau\in[0,T] τ∈[0,T]满足 d G ( τ ) d τ ≤ C G ( τ ) F ( τ …

BJFU|大数据基础考前速记(含考试大纲与复习笔记)

考试大纲与复习笔记在文末 考前速记 2010年前后&#xff0c;大数据、云计算、物联网的快速发展拉开了第三次信息化浪潮的大幕。 信息科技需要解决信息存储、信息处理和信息传输三个核心问题。解决方式是&#xff1a;存储设备容量不断增加、CPU处理能力大幅提升、网络带宽不断…

Flutter图片内存占用过大问题

图片(Image)加载原理&#xff1a; Image &#xff1a; 显示图⽚的Widget&#xff0c;通过ImageState管理ImageProvider的⽣命周期。 ImageProvider&#xff1a; 图⽚的抽象概念。 根据Image创建实例时调用的工厂方法的不同&#xff08;Image.network或者Image.assetImage&#…

mysql根据时间段生成时间

在开发过程中&#xff0c;经常会遇到统计&#xff0c;如果统计的时间段内有间隔&#xff0c;不管是左连接还是右连接都不会有&#xff0c;所以这时候我们需要写个语句能补全这段时间内所有的时间&#xff0c;然后用时间去关联业务查询。 select num : num 1,date_format(addda…

WPF DataGrid常用属性

AlternationCount属性&#xff1a;表示有几行不同的颜色来回替换&#xff0c;如果设置2则表示有两个颜色交替循环 AutoGenerateColumns属性&#xff1a;是否生成列 CanUserAddRows属性&#xff1a;用户是否可以添加行 CanUserDeleteRows属性&#xff1a;用户是否可以删除行 …