- 博客(45)
- 收藏
- 关注
原创 Map和Set(Java数据结构)
在开始之前,我们先来看一下下图:如上Set和Map接口,对于这两个接口的功能不一样,但是他们统一解决搜索问题.因为我们目前存在一些场景,需要去统计一些问题,或者需要快速找到一些数据.比如说根据身份证好在派出所的系统中,当输入身份证号直接输入之后,就可以在几亿人中快速找到.这里这么多信息都是存在数据库中的,这里也是同理,虽然这里数据没有几亿那么多,现在要把它存在内存里面,还是要使用数据库,这里就会用到Set或者Map其中的一个.
2024-11-26 18:18:37
760
原创 排序(Java数据结构)
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问 题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)4. 稳定性:稳定归并排序的大思路是:先分解后合并如上逻辑图,分解成10,6,7,1之后,再分解成10,6,先弄完10和6之后递归回去,再弄7,1.
2024-11-24 14:07:33
1179
原创 优先级队列(堆)(java数据结构)
Java集合框架中提供了和两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,本文主要介绍PriorityQueue。下面我们来演示一下是什么样的:这里我们往这个优先级队列里面放几个元素,这里没人告诉我们他是大根堆还是小根堆,这里我们peek一下这个元素,看我们拿到的是10(大根堆)还是5(小根堆).结果如下:如上结果意味着,当我们实例化一个PriorityQueue对象之后,其实默认是一个小根堆.
2024-11-20 20:41:32
879
原创 二叉树相关oj题(Java)
以上图为例,这里还是先把A放进队列,然后树不为空,出A,所以他是第一层,有一个节点,再把A的左树和右树放进去,此时队列里面有2个元素,就是第二层,这里是两个元素,出两次就好了,也意味着出B的时候把D和E带进队列了,再出C就把F和G带进队列了,这是刚好B和C加起来出了两次,说明第二层有两个节点,此时队列里面有四个元素,就是第三层,后面依次类推。定义一个i,遍历前序遍历 ,从根节点开始遍历,然后对应的在中序遍历中找到根节点(E是根节点,根节点的左边是左树,根节点的右边是右树,如上中序遍历图划分)
2024-09-30 17:31:23
690
原创 二叉树(Java)
设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树。若一个结点含有子结点,则这个结点称为其子结点的父结点;以某结点为根的子树中任一结点都称为该结点的子孙。一个结点含有的子树的根结点称为该结点的子结点;
2024-09-23 13:04:34
1073
1
原创 (Java)队列
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为。
2024-04-25 12:24:17
845
原创 进程和线程之间的区别和联系
线程是指进程内的一个执行单元,也是进程内的可调度实体.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间, 一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。6.系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销(线程比进程更轻量,不仅创建快,其销毁也快)。(1)二者均可并发执行.
2024-04-02 15:41:37
723
原创 如何创建线程
4.实现runnable,重写run,匿名内部类。3.继承Thread,重写run,匿名内部类。2.实现Runnable,重写run。1.继承Thread,重写run。5.lambda 表达式[推荐]
2024-03-27 11:24:08
261
1
原创 (Java)栈
进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,出栈:栈的删除操作叫做出栈。一种特殊的线性表,其。
2024-01-02 19:21:50
443
原创 LinkedList的模拟实现
所以,这里直接让cur走两步,走到2号节点位置,然后让cur.prev.next=node(node是0x123),这里要注意以下, 因为在单向链表中,我们说过在这种情况下进行插入的时候要先绑定后面,在看前面,所以这里也是同样的道理,这里不能先让前面的cur.prev.next=node,而是先让node.next=cur,这就把0x123的next修改成了0x78,然后再让cur.prev.next=node,紧接着让node.prev=cur.prev,然后让cur.prev=node即可。
2023-12-06 16:31:23
94
原创 链表面试题
1. 删除链表中等于给定值 val 的所有节点。OJ链接这个就相当于removeAllKey./** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, Lis
2023-11-16 14:27:30
138
原创 扑克牌游戏(数据结构(顺序表))
而通过上面的打印结果,我们知道,此时的牌是有顺序的,而我们要把它洗乱。这里我们定义一个i下标,让他从后往前走(如果从前往后走就比较麻烦,因为不知道传几合适,当i=0下标时时,如果传51,生成0-50,包含0自己了...所以让他从后往前走,每次生成一个随机数跟i交换就可以了),当=51时,就生成0-50的随机数,让其i=50,就生成0-49的随机数。现在本质上来说,相当于我们所有的牌都在如下这个数组里面。1.生成一副扑克牌(问题:放到哪里?(问题:怎么抓牌,抓的牌放到哪里?
2023-10-25 09:27:07
375
原创 杨辉三角(数据结构(顺序表))
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。提示:1
2023-10-25 09:26:49
95
原创 ArrayList简介
在这个代码中int minCapacity就是10,在if语句中minCapacity为10,因为根本没有分配内存,所以数组elementData.length的长度为0,这里10减0一定是大于0的,所以它又调用了grow方法,grow是成长的意思,所以它就是一个扩容方法。ArrayList是一个数组列表,他的底层实现是Object数组 ,但与Java中数组相比,它相当于一个动态扩容的数组,但我们实例化他时,并没有为这个数组申请空间,只是在添加数据时,为其开辟一个数组长度为10的数组。
2023-10-18 22:54:03
148
原创 顺序表(原理)
这里肯定会有人脱口而出,三个。这个是要分情况的,对于当前这里面如果放的是基本数据类型,直接将usedSize置为i0,如上图,如果usedSize为0,再来一个新的数据也没关系,因为新数据会把 21盖掉,因为他每次都在往usedSize位置放,所以对于当前代码,直接将usedSize=0就好,不管它里面有些撒数据,没关系。这里我们要知道,不合法要返回一个值,接收一下返回值,返回,然后结束这个方法,不能再继续往下执行了,而且如上,打印一个不合法这件事情,当打印的比较多的时候,可能会找不到,那应该怎么办呢?
2023-10-17 22:22:11
160
原创 包装类&简单认识泛型
就是说如果i在[-128,127]这个范围里面,可直接去某个下标拿(如上图红色框里面的值),因为都在这个数组中,所以相等,如果不在这个数组范围中,就去new,而每次new就会产生新的对象,新的对象会产生新的地址,所以a1和b1的地址不一样,他们就不想等。所以,我们当前这样写有一个不好的地方,虽然它什么类型都可以放,但是他放的太乱了,而且每次取的时候都要强转。为什么学包装类,是因为如上代码过程中不能放基本类型,不然会报错,所以这个过程中只能放包装类或引用类型,这就叫泛型,所以什么是泛型呢?
2023-10-07 23:38:24
55
原创 Comparable和Comparator区别
Comparable和Comparator都可以用来进行比较、排序。Comparable可以直接在需要进行排序的类中实现,重写compateTo(To)方法;而Comparator需要另外顶一个实现Comparator接口的实现类来作为“比较器”。二者各有优缺点,用Comparable简单,只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。
2023-09-20 23:49:19
66
原创 认识异常(Java)
Java 中虽然已经内置了丰富的异常类, 但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构.例如, 我们实现一个用户登陆功能.if (!if (!System.out.println("登陆成功");此时我们在处理用户名密码错误的时候可能就需要抛出两种异常. 我们可以基于已有的异常类进行扩展(继承), 创建和我们业务相关的异常类.具体方式:1. 自定义异常类,然后继承自Exception 或者 RunTimeException。
2023-08-14 10:53:48
53
原创 String 类(Java)
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法,其它需要用到了大家可参阅/追加:即尾插-->字符、字符串、整形数字/ hello/true/ 获取0号位上的字符 h/ 获取字符串的有效长度14/ 获取底层数组的总大小/ 设置任意位置的字符 Hello world123!!");!!/ 获取Hello第一次出现的位置。
2023-08-14 09:54:48
60
原创 继承和多态(Java)
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序是就需要考虑。比如:狗和猫,它们都是一个动物。通过观察上述代码会发现,猫和狗的类中存在大量重复,如下所示:那能否将这些共性抽取呢?
2023-08-13 19:53:36
176
原创 类和对象(Java)
面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象(实体)进行抽象(对一个复杂事物的重新认知),但是这些简化的抽象结果计算机也不能识别,开发人员可以采用某种面相对象的编程语言来进行描述,比如:Java语言。/创建类field;/字段(属性) 或者 成员变量method;/行为 或者 成员方法class为定义类的关键字。
2023-08-13 19:25:23
109
原创 数组的定义与使用(Java)
数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。比如现实中的车库:在java中,包含6个整形类型元素的数组,就相当于上图中连在一起的6个车位,从上图中可以看到:1. 数组中存放的元素其类型相同2. 数组的空间是连在一起的3. 每个空间有自己的编号,其实位置的编号为0,即数组的下标。那在程序中如何创建数组呢?
2023-08-12 18:54:34
446
原创 方法的使用(Java)
方法语法格式// 方法定义修饰符 返回值类型 方法名称([参数类型 形参 ...]){方法体代码;[return 返回值];public static 返回值类型 方法名(形式参数列表) {方法体;(方法名随便取)方法名采用小驼峰(形式参数列表)可能有多个列表,如:sum(int a,int b) 注意:每一个参数都要加类型当public static 返回值类型 方法名(形式参数列表) {中有返回值类型的时候一定要return这个类型,不然就会报错,如:return a+b;
2023-08-12 17:30:17
158
1
原创 运算符(Java)
计算机的最基本的用途之一就是执行数学运算,比如:int a = 10;int b = 20;a + b;a < b;上述和等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - */)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
2023-08-09 17:12:43
120
原创 初识Java
在main方法里面要注意几个点:1.类名要大驼峰(就是如果有两个单词,每个单词的首字母大写。2.一个Java文件可以有多个类,只能有一个public修饰的类。(所以 (public class HelloWorld{)中这个public可加可不加。
2023-08-07 10:23:21
41
原创 指针的进阶(c语言)
1. 字符指针2. 数组指针3. 指针数组4. 数组传参和指针传参5. 函数指针6. 函数指针数组7. 指向函数指针数组的指针8. 回调函数9. 指针和数组面试题的解析指针的主题,我们在初级阶段的《指针》章节已经接触过了,我们知道了指针的概念:1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候的权限。4. 指针的运算。这个章节,我们
2023-08-06 17:08:34
58
原创 数据在内存中的存储(c语言)
前面我们已经学习了基本的内置类型(内置类型指c语言本身具有的):char//字符数据类型(1个字节)short//短整型(2个字节)int//整形(4个字节)long//长整型(4/8个字节)long long//更长的整形(8个字节)float//单精度浮点数(4个字节)double//双精度浮点数(8个字节)//C语言有没有字符串类型?以及他们所占存储空间的大小。#include/这个头文件就限定了整形能表示的最大值/最小值。
2023-07-26 08:51:47
233
1
原创 详解二进制,八进制,十进制十六进制的相互转换
这个数字代表了200+30+5的和,换种方式就5x10的0次方+3x10的1次方+2x10的二次方。
2023-07-26 08:51:22
606
1
原创 练习(错题)
计算1/1-1/2+1/3-1/4+1/5 ……+ 1/99 - 1/100 的值,打印出结果。将数组A中的内容和数组B中的内容进行交换。【一维数组】交换数组。
2023-07-19 10:23:33
161
原创 函数的栈帧的创建和销毁(c语言)
pop ebp,指弹出一个指令放到ebp里面去,弹出的是如下图红色框,而他存的是main函数的ebp的地址,这个地址存在这,就是当我们函数返回之后随着Add函数栈帧的销毁,我们能很容易找到main函数的栈顶,但是找不到main函数的栈底,所以把栈底存在这里,当esp走到这里的时候,pop一下,把结果弹出,弹到ebp里面去,这个时候,就意味着ebp走了,回到如下图位置。第一段代码中,call(调用的意思),(此时按F11观察),你会发现,call调用的是第二条代码的地址003518F7。
2023-07-09 20:18:41
245
2
原创 实用调试技巧(c语言)
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。注:参考资料Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。(在vs左上角,调成Debug就是调试版本,调成Release是发布版本)int main()int i = 0;for (i = 0;i < 10;i < 10;i++)
2023-07-07 11:00:28
136
1
原创 结构体(c语言)
有了结构体类型,那如何定义变量,其实很简单。这里想要创建struct S结构体变量,有三种方式:1struct Sint a;int* p;直接此类型创建,如s1(初始化了)(全局变量)2(全局变量)(初始化了)3int mian()(这样写是错误的,这里无法确定顺序)(这样写,自定义了顺序,以.的方式确定成员,然后把值放进去).是成员访问操作符,顺序自定义return 0;这里要初始化B,先初始化ch,再初始化s,再初始化dstruct Sint a;int* p。
2023-05-24 17:06:48
72
1
原创 操作符(c语言)
单目操作符只有一个操作数!逻辑反操作- 负值+ 正值& 取地址sizeof 操作数的类型长度(以字节为单位)~ 对一个数的二进制按位取反-- 前置、后置--++ 前置、后置++* 间接访问操作符(解引用操作符)(类型) 强制类型转换!逻辑反操作就是把真变成假,把假变成真应用场景:int main()if (!flag)//flag /为假 打印heheif (flag)
2023-05-15 16:55:37
209
1
原创 扫雷游戏(c语言)
扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非地雷的格子,同时避免踩到地雷,踩到一个地雷全盘皆输。
2023-05-09 21:15:16
169
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人