数据结构
文章平均质量分 50
Putarmor
世间万物皆在冲!加油!
展开
-
数据结构复习笔记特别系列4 —— 二叉树
二叉树一定是大家比较懊恼的题,二叉树的思想是大化小,但想将这种思想用起来掌握好,还是具有一定难度。原创 2021-07-14 13:34:02 · 534 阅读 · 0 评论 -
数据结构复习笔记系列3 — 队列
1.队列定义队列:只允许在一端进行数据插入操作,在另外一端进行数据删除操作的特殊线性表,具有先入先出的特点。进行插入操作的一端称为队尾(tail/rear),进行删除操作的一端称为队头(head/front)。举个例子来说,就像我们平时买东西一样,排的队就可以看作一个队列。2.手动实现循环队列1)实现队列方式队列可以用链表也可以用数组去实现,用链表实现表现更优一点,当使用数组时,因为队列先进先出的特性,删除元素时,其余元素都要整体移动,这样时间复杂度会达到O(n)。2)集合中队列继承体系根原创 2021-06-24 14:52:18 · 134 阅读 · 0 评论 -
数据结构复习笔记系列2 — 栈
栈和队列的思想是编程中非常巧妙地思想。原创 2021-06-23 20:08:11 · 382 阅读 · 4 评论 -
数据结构复习笔记系列1 — ArrayList
面试中对于ArrayList和LinkedList考察比较频繁,在这里需要我们对源码有一定的了解。原创 2021-06-22 21:13:07 · 160 阅读 · 1 评论 -
Java包装类 — 自动装箱、自动拆箱
今天探讨一下基本数据类型和包装类之间的关系:原创 2021-06-21 17:37:28 · 206 阅读 · 0 评论 -
Java【泛型】复习笔记
1.泛型出现的意义:在没有出现泛型之前,假如我们实现一个栈,栈中存放的数据类型只能有一种;当我们想去存放另外一种数据类型时,又要重新创建一个类,定义存放的数据类型;可以看出,这样操作是非常不方便的,同时代码也是非常冗余的,不够简洁。我们猜想创建Object类型的栈是否可以弥补上述的缺点?Object类默认是所有类的父类,当栈中存放的数据类型为Object类型,任何类型的元素看起来都可以存放在栈中,似乎看起来很完美,但是在我们取得元素的时候,却需要做强制类型转换例如String str = (St.原创 2021-06-17 16:54:50 · 176 阅读 · 2 评论 -
Lambda表达式你学废了吗!
新特性:Lambda一级目录二级目录三级目录一级目录二级目录三级目录原创 2021-06-15 18:56:22 · 289 阅读 · 0 评论 -
Comparable和Comparator接口的差异
Comparable和Comparator接口问题提出引用类型对象比较基本数据类型比较对象的比较1.重写equals方法2.Comparable接口3.Comparator接口三者的区别问题提出优先级队列也就是堆,在插入元素时有个要求:插入的元素不能是null或者元素之间必须能够进行比较,为了简单起见只是在优先级队列中插入Integer类型,那么当我们想插入自定义的对象时,能不能实现呢?//定义扑克牌内部类class Card{ public int rank; //代表牌的数值原创 2021-06-10 19:21:05 · 447 阅读 · 4 评论 -
一文让你读懂“反射机制”!
反射机制一级目录二级目录三级目录一级目录二级目录三级目录原创 2021-06-08 19:37:42 · 517 阅读 · 3 评论 -
剑指4 重建二叉树
题目要求输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析将前序遍历每一个结点当作根结点,然后在中序遍历中去寻找该结点的位置记录中序遍历中根结点的下标,对左右两个区间进行递归实现代码public class Solution { public int i; public Tr原创 2021-03-23 15:41:31 · 111 阅读 · 0 评论 -
剑指29 最小的k个数
题目描述给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组输入 [4,5,1,6,2,7,3,8],4输出 [1,2,3,4]代码实现:import java.util.ArrayList;import java.util.PriorityQueue;import java.util.Comparator;//思想:最大堆public class Soluti原创 2021-04-19 17:35:43 · 102 阅读 · 1 评论 -
剑指23 二叉搜索树的后序遍历
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)示例:输入:[4,8,6,12,16,14,10]输出:true解决思路算法步骤如下:1.找到根结点;2.遍历序列,找到第一个大于等于根结点的元素i,则左侧为左子树、右侧为右子树;3.我们已经知道左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回原创 2021-04-01 17:53:58 · 116 阅读 · 0 评论 -
剑指22 从上往下打二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。示例:输入 {5,4,#,3,#,2,#,1}输出 [5,4,3,2,1]解题思想:1.该题本质是二叉树的层序遍历,层序遍历的过程是从上到下从左到右2.借助一个队列,首先判断root是否为空,为空直接返回list;不为空将root入队,通过while循环,用结点cur记录每一次弹出的结点,然后将cur.val添加至list中,然后判断cur左子树和右子树是否为空,不为空则将cur左孩子与右孩子入队,当整个队列为空时循环退出,返回原创 2021-03-31 09:40:28 · 117 阅读 · 2 评论 -
剑指57 二叉树的下一个结点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。分析:首先我们需要清楚二叉树中序遍历的规则是: 左 —> 根 —> 右对于该树,将其中序遍历后的结果为:DBHEIAFCG根据中序遍历的规则,可以将中序下一结点分为以下3种情况:1当前结点有右子树,下一结点是当前节结点右子树中的最左结点,例如对B结点而言,其下一个结点是H2当前结点无右子树,且结点是该结点父结点的左子树,则原创 2021-03-17 10:27:35 · 175 阅读 · 1 评论 -
二叉搜索树的认识
二叉搜索树(二叉排序树二叉搜索树概念1.查找2.插入3.删除(重点)二叉搜索树概念二叉搜索树也可以叫做二叉排序树,一个空树也可以称为二叉搜索树。具备以下性质:[1]若左子树不为空,左子树上所有结点的值都小于根结点的值;[2]若右子树不为空,则右子树上所有结点的值都大于根结点的值;[3]一个二叉搜索树的左右子树都是二叉搜索树;1.查找//查找关键字为key结点 思想:向后遍历 public Node search(int val){ if(root == null)原创 2021-03-03 15:12:53 · 149 阅读 · 0 评论 -
Java栈 习题回顾
1.栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)示例1输入:[1,2,3,4,5],[4,3,5,1,2]输出:falseimport java.util.Stack;public class Solution {原创 2021-02-16 23:21:57 · 248 阅读 · 0 评论 -
List练习题
1.找到小镇的法官 leetcode 997在一个小镇里,按从 1 到 N 标记了 N 个人。传言称,这些人中有一个是小镇上的秘密法官。如果小镇的法官真的存在,那么:小镇的法官不相信任何人。每个人(除了小镇法官外)都信任小镇的法官。只有一个人同时满足属性 1 和属性 2 。给定数组 trust,该数组由信任对 trust[i] = [a, b] 组成,表示标记为 a 的人信任标记为 b 的人。如果小镇存在秘密法官并且可以确定他的身份,请返回该法官的标记。否则,返回 -1。示例 1:输入:原创 2021-02-16 15:11:32 · 334 阅读 · 0 评论 -
Map与Set习题回顾
1.list中存放10000个随机数据,找出第一个重复的数据(set)public static int findFirstRepeatNumber(){ Random random = new Random(); ArrayList<Integer> q = new ArrayList<>(); for (int i = 0; i < 10000; i++) { q.add(random.nextInt原创 2021-02-15 22:31:57 · 144 阅读 · 1 评论 -
仅仅反转字母 leetcode-917
题目描述:给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。题目示例:示例 1:输入:“ab-cd”输出:“dc-ba”示例 2:输入:“a-bC-dEf-ghIj”输出:“j-Ih-gfE-dCba”示例 3:输入:“Test1ng-Leet=code-Q!”输出:“Qedo1ct-eeLg=ntse-T!”来源:力扣(LeetCode)链接:仅仅反转字母解决思路:1.用栈解决该问题①因为是反转,因而我们可以考虑栈的后进原创 2021-02-11 18:05:24 · 140 阅读 · 0 评论 -
数据结构中排序算法 Java实现
1.插入排序基本思想:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。每次选择无序区间的第一个元素,在有序区间选择合适的位置插入。当取第一个元素时认为是有序的,第二次从数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果符合条件(比前面的大或者小),则让它们交换位置。代码实现public static void insertSort(int[] array){ for (int i = 1; i < array.leng原创 2021-02-01 20:39:51 · 225 阅读 · 1 评论 -
堆(Heap or PriorityQueue) Java
认识堆(优先级队列)1.堆又叫优先级队列,逻辑上上是一棵完全二叉树,堆物理上基于数组实现2.堆可分为大堆(大根堆、最大堆)和小堆(小根堆、最小堆)堆(优先级队列)操作方法public class MyHeap { private int[] elem; private int usedSzie; public MyHeap(int k){ this.elem = new int[k]; } //创建大堆 public void原创 2021-01-29 22:02:22 · 443 阅读 · 6 评论 -
Java 二叉树遍历
题目描述:编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。代码实现import java.util.*;class Node{ char val; //结点值 Node left; //结点前驱指针域 Node right; //结点后继指针域 public原创 2021-01-28 22:24:28 · 323 阅读 · 1 评论 -
Java leetcode-236 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点原创 2021-01-28 22:19:45 · 193 阅读 · 1 评论 -
Java 二叉搜索树与双向链表(面试题)
二叉搜索树与双向链表题目描述解决思路(后续再改进)实现代码题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。链接:二叉搜索树与双向链表解决思路(后续再改进)核心:怎么改变结点的前驱指向和后继指向实现代码public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null) ret原创 2021-01-28 22:03:52 · 320 阅读 · 1 评论 -
Java 有关二叉树操作方法及基础面试题
神经二叉树搞起来二叉树二叉树的性质:二叉树操作方法三种遍历方式其余操作方法二叉树经典基础面试题二叉树二叉树的性质:二叉树操作方法三种遍历方式1.前序遍历2.中序遍历3.后序遍历其余操作方法 遍历思路 求二叉树结点个数 static int size = 0; void getSize1(BTNode root){ if(root == null){ return ; } //原创 2021-01-27 20:20:00 · 395 阅读 · 0 评论 -
Java 二叉树 前序遍历、中序遍历、后序遍历
/* 前序遍历 */ void preOrderTraversal(BTNode root) { if(root == null) return; System.out.print(root.val+" "); preOrderTraversal(root.left); preOrderTraversal(root.right); }/* 中序遍历 */ void inOrder.原创 2021-01-26 21:27:20 · 257 阅读 · 1 评论 -
有效的括号 leetcode-20
==给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses示例:解决思路:1.用集合中的栈解决2.遍历整个字符串,当遇到左括号时,一律压栈;遇到右括号时,判断栈顶元素括号是否和该元素匹配,也就是说栈顶元素为该括号对应的左括号,这时原创 2021-01-25 20:00:38 · 159 阅读 · 0 评论 -
Java 1.队列实现栈 2.栈实现队列 3.实现最小栈
高频面试题!1.用队列实现栈使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/implement-stack-using-queues//定义两个队列实现栈 Queue<Integer> queue1 = new LinkedList<>(); Que原创 2021-01-25 17:51:48 · 188 阅读 · 0 评论 -
Java 栈知识总结及栈的方法实现
栈栈相关概念栈示意图栈常用的操作方法栈相关概念1.什么是栈?栈是一种特殊的线性表,其值允许在固定的一端进行插入和删除元素操作,进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈结构中的元素统一遵循后进先出的原则。2.栈结构细分从数据存储结构进一步划分,栈可分为:顺序栈结构:即使用一组地址连续的内存单元依次保存栈中的数据。在程序中,可以定义一个指定大小的数组来作为栈,下标为0的元素就是栈底,再定义一个变量top指向栈顶的的位置即可。链式栈结构:即使用链表形式保存栈中各元素的值。链表首部元素原创 2021-01-24 22:44:19 · 667 阅读 · 1 评论 -
Java 实现循环队列(基于数组)
导语:循环队列又叫环形队列,基于数组实现。重要思想:设计双指针与取模思想实现思路:1.定义两个指针front和rear,约定front指向队列第一个元素,也就是指向数组0下标位置;约定rear指向可存储元素的位置2.rear下标存储元素后,向后走一步3.front向后走一步,表示一个元素出队4.当front和rear相遇时,也就是front与rear相等时,表明队列为空5.牺牲了一个空间,去判断队列是否处于满的状态;当(rear+1)% arr.length == front时,表明队列已.原创 2021-01-24 20:55:31 · 470 阅读 · 0 评论 -
Java 无头双向链表实现队列queue
队列queue底层通过无头双向链表实现,下面让我们实现一下queue常用的操作方法class ListNode{ ListNode next; //指针后继域 ListNode prev; //指针前驱域 int val; //指针数值域 public ListNode(int val) { this.val = val; }}public class MyQueue { private ListNode first;原创 2021-01-24 18:27:53 · 188 阅读 · 0 评论 -
Java leetcode-面试题 链表相交
LeetCode链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/问题描述:给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。示例1输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,原创 2021-01-13 22:30:32 · 210 阅读 · 1 评论 -
Java leetcode-142 环形链表II
此题是判断链表是否有环这个题的升级版,也就是说如果判断链表有环,找到开始入环的第一个结点,否则返回null。思路:在之前题的基础上补充后面的思路:1.如果链表无环,返回null2.当链表有环时,此时slow和fast相遇,fast位置不动,让slow指向头结点,当fast和slow指向结点不同时,slow和fast一次一步向后走,循环退出时,slow或fast所指向的结点就是入环结点。public ListNode detectCycle(ListNode head) { if(h原创 2021-01-13 22:06:57 · 146 阅读 · 0 评论 -
Java leetcode-141 环形链表
如何判断一个链表是否有环呢?对于普通链表而言,链表末尾的指针域为null,如果链表有环,链表没有指针域为null结点。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。下面是代码实现过程,用我们熟悉的快慢指针比较简单public boolean hasCycle(ListNode head) { if(head原创 2021-01-13 20:21:06 · 179 阅读 · 0 评论 -
Java leetcode-234 回文链表
题目描述请判断一个链表是否为回文链表。回文链表的意思是:链表从前往后和从后往前的效果是一样的,具体是怎样的,我们来看两个示例。输入: 1->2 输出: false输入: 1->2->2->1 输出: true输入: 1->2->3->2->1 输出: true对于这个题本身而言,理解逻辑知晓解题步骤后,那么实现起来就相对容易了。核心思想:快慢指针三步走:①找到链表中间结点 ②从中间结点的下一个结点开始向后反转 ③whiel循原创 2021-01-13 19:53:14 · 147 阅读 · 0 评论 -
Java leetcode&NC 链表分割
题目描述编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。例如:输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8来源:力扣(LeetCode)链接:NC链表分割 Le原创 2021-01-12 15:39:26 · 220 阅读 · 1 评论 -
Java leetcode-237 删除链表中的结点
题目描述编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。也就是说尾结点是不能删除的,传入函数的唯一参数为 要被删除的节点 。例如现在有一个链表:head = [4,5,1,9],它可以表示为:示例1:输入:head = [4,5,1,9], node = 5输出:[4,1,9]给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例2:输入:head = [4,5,1,9], node = 1输出:[4,5,9]给原创 2021-01-12 14:39:49 · 219 阅读 · 0 评论 -
Java leetcode-JZ18 删除链表结点
题目描述给定单向链表的头指针和一个要删除的结点的值,定义一个函数删除该结点,然后返回删除结点后的链表的头指针。示例1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为原创 2021-01-12 14:22:26 · 189 阅读 · 0 评论 -
Java leetcode-21合并两个有序链表
题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:实现代码class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode newHead = new ListNode(-1); //创建一个哑结点,方便后面表示新的链表头 ListNode tmp = newHead;原创 2021-01-11 18:32:44 · 219 阅读 · 0 评论 -
Java 牛客JZ-14 leetcode-JZ-22 链表中倒数第k个结点
返回链表中倒数第k个结点题目描述解决思路实现代码题目描述输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个结点。例如,一个链表有6个结点,从头结点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。示例输入:1,{1,2,3,4,5}输出:{5}来源:力扣(LeetCode)牛客网链接:链表倒数第k个结点 链表倒数第k个结点解决思路快慢指针搞定!!!解题过程:首先判断表头是否为空以及原创 2021-01-11 18:14:17 · 293 阅读 · 1 评论