Java
文章平均质量分 70
Java相关知识
1886i
尽人事听天命
展开
-
【在线OJ】Vue创建OJ管理系统
vue ui命令创建项目项目创建完成后来到项目。原创 2024-05-07 19:36:48 · 307 阅读 · 0 评论 -
【在线OJ】Vue在线OJ项目
一、主页二、题库三、在线编译器四、比赛五、搜索六、个人主页原创 2024-05-05 15:58:38 · 395 阅读 · 0 评论 -
【在线oj系统】02-开发环境版本说明
使用Cloud的版本决定Boot的版本,SpringCloud的版本决定SpringBoot的版本要求JDK:17+Maven:3.9+MySQL:8.0+原创 2024-05-05 02:35:04 · 395 阅读 · 0 评论 -
【在线OJ】01-Vue前端项目创建与页面开发
npm install -g @vue/cli # 安装vue。创建文件夹使用VsCode打开后,新建终端输入以下命令。vue -ui # 在浏览器创建项目。表格+分页+搜索小demo。安装ElementUI。引入ElementUI。原创 2024-05-05 02:33:52 · 466 阅读 · 1 评论 -
【在线OJ】雪花算法代码实现
在实现时,首先我们要获取当前的时间戳,如果当前时间戳比上一次获取时,如果比上一次小说明这是一次非法调用抛出异常,如果等于上一次的时间戳说明这是同一毫秒,我们需要让序列化+1,但 同时我们需要判断序列化+1以后是否到达该毫秒内能生成的最大id如果等于了则获取下一毫秒的时间。用一个64比特位的long类型来作为生成id的类型,首先我们要了解哪些位置对应的意义,其中在本项目中10位的工作机器id被细分位5bit的机房id与5bit的机器id。雪花算法支持每毫秒生成2的12次方-1个id。原创 2024-04-17 21:49:22 · 218 阅读 · 0 评论 -
【数据结构】七大排序图解+代码实现
我们也可以进行优化,找一个是找要两个也是找,将数组整个分为三段[0,l -1](前已排序部分), [l, r](未排序部分), [r+1, n](后已排序部分)我们可以同时在未排序部分寻找未排序部分的最小值和最大值,最小值与l交换,最大值与r交换,这里要注意的时在将最小值与l交换后,需要判断我们寻找到的最大值是否指向l,如果指向l,在前面最小值与l交换中,l指向的位置已经被交换到了minIndex位置,此时我们需要将maxIndex的位置进行修改,确保最大值不变。依次重复上述步骤,直到j遍历完n-1遍。原创 2024-03-18 22:25:50 · 820 阅读 · 1 评论 -
【字符串匹配】BF与KMP算法
由于在kmp算法中,i指针是不回退的,所以我们在j匹配失败时需要让j回退到合适的位置上,而next数组就记录了当j此时匹配失败时回退到next[j]的位置继续进行匹配,那next数组是如何进行维护的呢。需要注意的是,BF算法的时间复杂度较高,为O((n-m+1)*m),其中n是主文本字符串的长度,m是模式字符串的长度。此外,在实际应用中,字符串匹配问题可能会有更多的变化和挑战,例如处理包含特殊字符的字符串,或者在不完全匹配的情况下找到最接近的匹配项。下面是使用C++实现BF算法的代码示例:。原创 2024-03-18 22:20:47 · 940 阅读 · 0 评论 -
【数据结构】万字长文图解+代码实现AVL树
在插入后这个时候我们通过观察发现此时这颗AVL树不平衡了,那么我们先要对这颗树上的节点进行平衡因子的更新,我们从插入的位置开始向上进行遍历,如果当前节点是父亲节点的左孩子就让父亲节点平衡因子--,因为是在左子树进行了插入而右子树不变 bf = 右子树高度- 左子树高度,左子树+1相当于 bf = 右子树高度- (左子树高度 + 1)= bf--,同理如果当前节点是父亲节点的右子树那么就让父亲节点的bf++我们完成了上述插入1的操作,并且通过右单旋维护了AVL树的平衡,此时我们再向上面树中插入80和90。原创 2024-03-10 02:22:15 · 1448 阅读 · 0 评论 -
【数据结构】HashMap的实现与常见问题
为了降低冲突的概率,例如小李是某某省的人,他的身份证开头是433432.后面是200011120882,小明是另一个省的他的开头是122121,后面也是200011120882,如果取低位那么他与小李就会冲突,而低位所包含的信息与高位包含的信息进行异或后则会降低冲突的概率。由于扩容使得哈希表的长度发生了改变,也意味着插入与获取元素的规则发生了改变,在寻找下标时我们使用key的哈希值与数组长度进行取模运算,扩容使得数组长度发生了变化,所以我们在进行扩容时需要对原有哈希表的元素进行重新哈希,让其满足新的规则。原创 2024-03-09 14:31:56 · 965 阅读 · 0 评论 -
【数据结构】图解二叉搜索树的新增、搜索、删除
通常的做法是找到该节点的右子树中的最小节点(或者左子树中的最大节点),用这个节点的值替换待删除节点的值,然后删除那个最小(或最大)节点。依旧往左发现往左为空,于是我们就可以将1插入到此处,但是要想插入到这里,我们需要记录父亲节点,所以在遍历的时候我们需要记录父亲节点位置。总的来说,二叉搜索树的删除操作是一个相对复杂的过程,需要根据不同的情况采取不同的策略,并且在整个过程中保持树的平衡和有序性。当前cur节点的值依旧比目标值9要小,于是我们又去他的右子树中寻找。有如下这样一颗二叉树,我们需要查询9所在节点。原创 2024-03-07 00:54:29 · 953 阅读 · 0 评论 -
【排序】希尔排序
它的主要思想是将待排序的序列分割成若干个子序列,这些子序列的元素是相隔一定“增量”的。然后对每个子序列进行直接插入排序。当增量减至1时,整个序列会进行最后一次直接插入排序,此时整个序列变为一个子序列,排序完成。随着增量递减,子序列包含的元素越来越多,但此时大部分元素已经基本有序,插入排序依然高效。总之,希尔排序的效率很大程度上取决于增量序列的选择,不同的增量序列可能导致排序性能的显著差异。虽然到目前为止没有找到最佳的增量序列,但通过合理选择增量序列,希尔排序在大数据集上通常表现出比传统插入排序更好的性能。原创 2024-03-06 01:06:29 · 419 阅读 · 0 评论 -
【排序】详解归并排序
归并排序是一种稳定的排序算法,适用于大数据量时效率较高,且可以用于链表等数据结构的排序。然而,它的不足之处在于需要额外的存储空间来存放临时数组,并且对于小规模数据的排序效率不如某些简单的排序算法,如插入排序。此外,由于其递归的特性,归并排序在深度很大的情况下可能会导致调用栈溢出。归并排序的核心思想是分治法,即将大问题分解成小问题来解决,然后再将解决后的小问题的结果合并以解决原来的大问题。对于一个这样的数组,首先我们需要将这个数组不断的划分为两个子数组。然后将这些子数组逐个排序合并。原创 2024-03-05 20:44:26 · 451 阅读 · 0 评论 -
【排序】详解堆排序
具体实现如下:首先我们需要从最后一个孩子所在的子堆进行调整,最好一个孩子就是数组长度-1的位置,那么我们如何根据孩子节点的下标去求出父亲节点的下标呢,我们只需要让孩子节点的下标减去1的差然后除2就能得到父亲节点的下标,同样我们知道父亲节点的下标同样除2在加1就能求出孩子节点的下标。首先我们需要找到孩子节点中的最大值,然后拿他与父亲节点比较,如果他比父亲节点大,那么就进行交换,然后依次向下进行调整(调整孩子节点的子堆),如果比父亲节点小说明这个堆已经调整完成我们就可以结束向下。重复此操作将最大值交换到末尾。原创 2024-03-05 20:18:23 · 861 阅读 · 0 评论 -
【排序】详解冒泡排序
在每一轮的排序过程中,都会从数列的起始位置开始,对相邻的元素进行比较,如果它们的顺序不符合要求(例如,前一个元素大于后一个元素),则交换它们的位置。这样,每轮遍历后,至少会有一个元素被移动到其最终位置。如果一个数组本来就是有序或者经过小于n-1次就已经排好了序,那么j指针后续的遍历就是徒劳,所以我们可以根据j指针在遍历过程中是否有交换进行判断,如果没有交换说明已经排好序,这个时候就可直接返回。冒泡排序的过程可以形象地比喻为水中的气泡上升过程,较小的元素逐渐“冒”到数列的顶端,而较大的元素则沉到底部。原创 2024-03-05 19:24:14 · 458 阅读 · 0 评论 -
【排序】详解选择排序
图解依旧将数组分为已排序部分跟为排序部分,初识时定义一个指针指向已排序部分的下一个位置,然后定义一个指针指向未排序部分,依次遍历未排序部分寻找未排序部分的最小值,寻找到后与已排序部分的下一个位置进行交换依次重复。开始时i指向已排序部分的下一个位置,j指针在未排序部分寻找最小值此时minIndex指向了最小值,于是将他与i位置进行交换,之后i指向下一个位置,j依旧在剩余未排序部分去寻找最小值,重复上述步骤。原创 2024-03-05 19:06:49 · 507 阅读 · 0 评论 -
【排序】详解插入排序
在j从i-1遍历向0的过程中,拿arr[j]与存储的变量t进行比较,因为前部分都是已排序部分,所有在进行比较时会出现两种情况:1》arr[j] > t 说明此时j位置并不是t要插入的位置,这个时候我们可以让j+1的位置修改为arr[j],然后j--继续去比较 2》arr[j] < =t, 此时说明j位置就是t要插入的位置,我们可以结束j的遍历然后让j + 1位置的值更改为t。这个时候arr[j] > t,于是让arr[j+1]=arr[j]依旧是arr[j] > t,于是让arr[j+1]=arr[j]原创 2024-03-05 18:35:23 · 636 阅读 · 0 评论 -
【排序】基于快速选择算法的快排实现
此时进行将遍历指针指向的元素与基准元素进行比较依次重复此操作,当遍历指针指向的元素比基准元素小时执行:swap(arr[i++], arr[++s]) ,当与基准元素相等时只需要执行i++即可。总的来说,快速选择算法是一种基于快速排序的选择算法,它高效地解决了在不完全排序的数组中寻找特定顺序元素的问题,并因此在各种算法竞赛和实际应用场景中得到了广泛的使用。然后使用一个指针指向开始位置依次往后遍历,如果当前元素比基准元素大则将该元素放在末尾,也就是基准元素后面,如果比当前元素小则将他放在基准元素前面。原创 2024-03-04 00:31:30 · 497 阅读 · 0 评论 -
【二分】第k个缺失的数
第K个缺失的数。原创 2024-03-03 02:14:23 · 333 阅读 · 0 评论 -
【双指针】移动零
移动零。原创 2024-03-03 02:10:51 · 342 阅读 · 0 评论 -
【双指针】删除有序数组中重复元素,双指针原地修改数组
删除有序数组中重复元素。原创 2024-03-03 01:47:04 · 350 阅读 · 0 评论 -
【双指针】合并两个有序数组O(N)
合并两个有序数组。原创 2024-03-03 01:45:12 · 346 阅读 · 0 评论 -
【快速选择】解决TopK问题
TopK问题就是在一个数组中寻找出最小(大)的前K个数,或者寻找出第K大(小)的数常见TopK问题图示常见TopK问题链接最小的K个数_牛客题霸_牛客网给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是。题目来自【牛客题霸】寻找第K大_牛客题霸_牛客网. - 力扣(LeetCode)优先级队列是一种数据结构,它根据元素的优先级来决定元素的插入和删除顺序。基于优先级排序:每个元素在队列中都有一个优先级,优先级最高的元素会首先被移除。使用特定数据结构。原创 2024-03-02 01:40:19 · 948 阅读 · 1 评论 -
【二分】二分模板+二分题目
- 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。. - 力扣(LeetCode). - 力扣(LeetCode)原创 2024-03-01 19:10:22 · 359 阅读 · 0 评论 -
【数据结构】七大排序代码实现
【代码】【数据结构】七大排序代码实现。原创 2023-10-23 22:52:50 · 150 阅读 · 1 评论 -
【Solution】商品秒杀之Redis缓存与MQ异步优化以及超卖一人一单等问题的解决
主要有三张表:用户表、商品表、订单表,将上述sql脚本执行一遍即可。原创 2023-10-19 22:38:30 · 579 阅读 · 0 评论 -
【计网】计算机网络概述
在每个数据块加上目的地址、源地址等控制信息,以存储转发的方式传输,其主要特点是单个分组传送到相邻结点,存储后查找转发表,转发到下一个节点。一般认为计算机网络是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统,结点将分组的所有比特推向链路所需要的时间,就是从发送分组的第一个比特开始算起,到该分组的最后一个比特发送完成所需要的时间。,用来实现联网计算机之间的各种信息传输,并将分散在不同地理位置的计算机连接起来,进行统一的调配、控制和管理。原创 2023-10-16 16:20:55 · 665 阅读 · 0 评论 -
【Solution】一文学会微信扫码登录
在该回调接口里面我们需要做的是首先根据参数code去获取access_token// 1. 根据code获取token,根据token获取微信用户数据。原创 2023-10-14 01:08:34 · 225 阅读 · 0 评论 -
【多线程】常见的几种锁策略以及synchronized的锁策略
乐观锁与悲观锁描述了两种不同的加锁态度,乐观锁就预测锁冲突的概率低所以做的处理比较简单,悲观锁就是预测锁冲突的概率比较高所以做的处理比较复杂。原创 2023-09-13 16:30:34 · 93 阅读 · 0 评论 -
【多线程】线程池的简单实现与线程池的拒绝策略
其中第一次个参数corePoolSize表示线程池里核心线程数的个数,第二个参数表示线程池中最大线程数,既然有了核心线程数那么为什么会有最大线程数呢?一个线程池可以同时提交n个任务,在线程池中会有m个线程去执行这n个任务,我们可以基于生产者消费者模型来实现线程池,首先我们需要一个阻塞队列来存储提交的任务,然后在构造方法中创建出m个线程去执行这些任务。当线程池中的任务队列已经满了时,再有新的任务提交进来时线程池会根据不同的拒绝策略采取不同的措施》》》我们先来看一下线程池的核心构造方法。原创 2023-09-10 19:44:19 · 291 阅读 · 0 评论 -
【多线程】Timer任务定时器实现与盲等原子性问题的解决
代码中的定时器通常是在一定的时间执行对应的代码逻辑。原创 2023-09-09 19:46:48 · 409 阅读 · 0 评论 -
【多线程】阻塞队列实现原理代码实现
阻塞队列是一种的特殊的队列,他是带有阻塞的线程安全的队列。当队列已满时入队操作就会进入阻塞,当队列不空时才能执行入队操作;当队列为空时出队操作就会进入阻塞,当有元素插入阻塞就会被唤醒执行。它经常用于实现生产者消费者模型。原创 2023-09-08 13:50:46 · 106 阅读 · 0 评论 -
【多线程】内存可见性
内存可见性是在编译器优化的背景下,一个线程修改了变量而另一个线程却没有感知到修改。举个例子,一个线程一直频繁的读取变量n并将n值与某一值进行比较,在底层这个操作对应着两个指令:读取内存中的n值加载到寄存器 LOAD 然后进行比较 CMP 这两个操作前者所需时间远远比后者多,短时间内重复进行LOAD、CMP操作性能低,编译器发现多次读取n值,该n值并没有被修改于是后续的读取不从主内存中读取n(内存)而是从工作内存中读取缓存的n值进行比较,这个时候另一个线程修改了内存里的n值,之前那一个线程并不能感知到。原创 2023-09-08 13:09:39 · 186 阅读 · 0 评论 -
【多线程】有两个线程都能访问n,初始时n为0,⼀个线程执⾏n++,n+=2,另⼀个线程执⾏n+=3,当两个线程都执行完后n可能的值
首先n++操作在底层是由三条指令在CPU完成的,先要将内存中n的值读取到CPU寄存器,然后将CPU寄存器中的值进行+1,最后再将CPU寄存器中的值写回内存。原创 2023-09-02 16:15:03 · 411 阅读 · 0 评论 -
【多线程】lock与synchronized的区别
3、在锁粒度的控制上不同,synchronized通过两种方式来控制锁的粒度,一种是将synchronized修饰方法,另一种是放在代码块上,并且我们可以通过synchronized锁对象的生命周期来控制锁的作用范围;4、在灵活度方面,lock比synchronized更加灵活,而且相比于无法实现非阻塞竞争锁的synchronized,lock提供了非阻塞竞争锁的tryLock()方法,这个方法通过返回true/false来告知当前线程该锁是否被其他线程持有。原创 2023-09-01 23:09:19 · 218 阅读 · 0 评论 -
【MongoDB】万字长文,命令与代码一一对应SpringBoot整合MongoDB之MongoTemplate
命令:db.comment.insert({_id:"4",nickname:"ww",content:"这位是谁啊",userId:3,createTime:……命令:db.collectionName.find({ "nickname": "ww" }).sort({ "like": 1 })命令:db.comment.find({ "like": { $gt: 0, $lt: 5 } })命令:db.comment.find({}).skip(2).limit(2)原创 2023-08-08 21:53:08 · 1894 阅读 · 0 评论 -
【MongoDB】索引
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,也就是扫描集合中的每一个文档,以选择与查询语句匹配的文档。这种扫描全集和的查询效率是非常低的,特别是在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对服务器的性能是非常致命的。如果查询存在适当的索引,就可以使用该索引限制必须检查的文档数。索引是特殊的数据结构,他以易于遍历的形式存储集合数据集的一小部分。索引存储特点的字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。原创 2023-08-08 18:23:30 · 1008 阅读 · 0 评论 -
【MongoDB】数据库、集合、文档常用CRUD命令
db.collection.update({userid:"1"},{username:"zs"}) # 覆盖修改,将userid为1的数据修改为username:"zs"},这种修改方式会导致其他字段消失,仅留下第二个参数的数据。db.collection.update({userid:"1"},{$set:{username:"zs"}}) # 这种修改会将userid为1的第一条数据中的username这一个字段修改为zs,其余字段不会被删除。原创 2023-08-08 18:04:01 · 1048 阅读 · 0 评论 -
【MongoDB】初识、安装MongoDB
MongoDB是一个开源的、高性能、无模式的文档数据库,设计初就是为了简化开发与方便扩展,他是最想关系型数据库的非关系型数据库。它支持的数据结构相对松散,是一种类似JSON格式的BSON,它既可以存储相对复杂的数据,也相当灵活。MongoDB中记录的文档,他是一个由字段与值对组成的数据结构。支持的BSON数据类型。原创 2023-08-06 17:43:01 · 825 阅读 · 0 评论 -
【数据结构】二叉树前中后层序遍历代码实现以及各种操作与二叉树OJ题目
如下图,按照前序遍历对这棵树进行遍历,我们先要遍历跟节点,然后左子树最后右子树 1-》2 -》4 -》8 -》5 -》9 -》 3 -》6 -》 7。与上树不同的是,我们只需计算叶子节点个数即可,那么叶子节点有什么特点呢,他的左右节点都为null,根据这一特点,我们可以知道一颗二叉树的叶子节点个数就 = 左子树叶子节点个数 + 右子树叶子节点个数。在计算节点个数的时候,采用子问题法将二叉树看作若干个子二叉树,则节点个数=当前节点的左子树个数+右子树节点个数+1,此时我们只需要进行递归遍历即可。原创 2023-07-27 17:48:46 · 429 阅读 · 0 评论 -
【WebSocket】SpringBoot整合WebSocket实现聊天室(一)
首先我们需要在项目中引入依赖,有两种方式。第一种我们可以在创建Spring Boot项目时搜索WebSocket然后勾选依赖第二种是我们可以直接在项目的pom.xml文件中插入以下依赖。原创 2023-07-07 22:12:03 · 1212 阅读 · 0 评论