- 博客(146)
- 收藏
- 关注
原创 七大经典排序算法之一——快速排序(Hoare版、挖坑版、前后指针版、递归和非递归版、三数取中版)
快速排序是一种高效的交换排序算法,由Hoare于1962年提出。其核心思想是通过基准值将数组划分为左右两部分,左部分小于基准值,右部分大于基准值,然后递归处理子数组。文章介绍了Hoare版、挖坑版和前后指针版三种划分方法,以及三数取中优化和随机数选取基准值的策略。同时提供了递归和非递归两种实现方式,使用栈结构模拟递归过程。快速排序平均时间复杂度为O(N*logN),空间复杂度O(logN),是一种不稳定的排序算法。
2025-11-15 09:03:48
355
原创 LeetCode 热题 100
本文介绍了两个经典算法问题的解法:1)两数之和问题,通过排序+二分查找和哈希表两种方法实现;2)字母异位词分组问题,采用哈希表结合字符串排序或字符计数的方式解决。在实现细节上,文章着重说明了数据结构的选用逻辑,包括哈希表键值的设计思路,以及避免类型错误的注意事项。对于字母异位词问题,还展示了基于桶排序的优化解法。两种解法均通过Java代码实现,并附有详细的思路解析和实现要点说明。
2025-11-13 09:42:47
391
原创 常用代码、配置
本文整理了前后端开发中的常用配置和依赖项。后端部分包含Spring Boot的YAML配置文件模板,涵盖MyBatis和MyBatis-Plus的数据源、日志及映射配置,以及相关Maven依赖项。前端部分详细介绍了Vue项目初始化、VueRouter路由配置、Pinia状态管理库集成和ElementPlus组件库的使用方法,包括相应的安装命令和代码示例。这些配置模板和命令可直接用于项目开发中,帮助开发者快速搭建开发环境。
2025-11-07 20:29:48
334
原创 Git 学习笔记
本文介绍了Git的基本操作与分支管理,包括安装卸载、本地仓库配置、文件修改提交、版本回退、撤销修改、删除文件等核心操作,以及分支创建、切换、合并冲突解决等分支管理技巧。重点讲解了Git工作区、暂存区和版本库的概念差异,并详细说明了Fast-forward合并的三种模式及其应用场景。文章还提供了常见命令如git add、git commit、git reset等的具体用法和注意事项,帮助用户掌握Git版本控制的基本工作流程。
2025-10-23 21:09:37
1158
原创 Redis 学习笔记(二)
Redis作为内存数据库,通过RDB和AOF两种策略实现数据持久化。RDB通过定时快照保存内存数据,支持手动(save/bgsave)和自动触发方式,其中bgsave利用fork()和写时复制技术实现后台保存。AOF则通过记录写操作实现数据同步。RDB文件默认存储在/var/lib/redis/dump.rdb,采用二进制压缩格式,每次备份会生成临时文件再替换原文件。两种持久化方式可能存在短暂不一致,重启时Redis会将硬盘数据重新加载到内存中。
2025-10-13 23:22:39
525
1
原创 Redis 学习笔记(一)
Redis是一种基于键值对的存储系统,采用客户端-服务器架构通过网络通信。文章介绍了Redis的数据操作命令和常见数据类型: 基本操作:设置/获取键值对(set/get)、批量操作(mset/mget)、判断键是否存在(exists)、删除键(del)、设置过期时间(expire/ttl)等 字符串类型:支持自增(incr)、追加(append)、截取(getrange)等操作 Hash类型:通过hset/hget操作字段值,支持hkeys/hvals/hgetall等查询命令 特殊技巧:使用--raw参数
2025-09-06 10:42:25
1050
原创 黑白浮生项目测试报告
本项目旨在开发一款跨终端的在线五子棋游戏平台,通过Web技术实现多人在线对战和人机对抗功能。项目背景基于五子棋的传统规则,结合互联网技术,打造轻量化、低延迟的即时对战环境,支持桌面、移动和平板设备。主要功能包括用户注册与登录、游戏大厅、匹配系统、游戏房间及胜负判定。测试计划涵盖功能测试和自动化测试,功能测试包括注册、登录、匹配、落子及游戏结束等场景,自动化测试则通过Selenium框架进行浏览器驱动管理,确保系统的稳定性和用户体验。
2025-05-13 22:13:54
1132
1
原创 软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
在多数软件公司,会有两部分需求。一部分是用户需求,一部分是软件需求。用户需求:通常是用户随口说的一句话,比如“我想要个能聊天的软件”。这种需求很模糊,不能直接拿来开发,比如用户没说要支持语音还是文字聊天。软件需求:产品经理对用户需求进行需求分析(技术可行性、市场可行性、成本投入和收益占比等)后得到软件需求,它是开发和测试人员工作的基本依据。产品经理会把用户需求“翻译”成具体能实现的东西。比如:聊天软件要支持文字、语音、发图片;消息要能撤回,还要有已读提示。
2025-04-20 20:37:14
1016
2
原创 Windows 11设置开机自动运行 .jar 文件
点击下一步,命名快捷方式(如MyJarApp),完成。重启电脑或注销后重新登录,检查程序是否自动运行。右键空白处 → 新建 → 快捷方式。
2025-04-18 19:03:40
1067
2
原创 更改 vscode ! + table 默认生成的 html 初始化模板
自己每次都要把 <html lang="en"> 改为 <html lang="ch">太麻烦了。
2025-03-22 12:41:06
526
2
原创 SpringCloud 学习笔记3(OpenFeign)
摘要:本文介绍了OpenFeign在微服务通信中的应用,它作为声明式Web服务客户端,简化了服务间调用。文章详细讲解了OpenFeign的使用方法,包括依赖引入、注解添加、客户端编写等。重点阐述了参数传递的三种方式:使用@RequestParam传递单个/多个参数,以及通过对象传递数据。通过示例代码展示了如何从订单服务调用商品服务的远程接口,体现了OpenFeign的便捷性。
2025-03-18 16:38:40
1207
2
原创 SpringCloud 学习笔记2(Nacos)
本文介绍了Nacos注册中心的安装配置与基本使用。主要内容包括:1)下载Nacos并修改启动模式为单机模式;2)在Spring Cloud项目中引入Nacos依赖并配置服务注册地址;3)利用@LoadBalanced注解实现服务调用负载均衡;4)Nacos控制台的服务管理功能,包括服务下线、权重配置和同集群优先访问策略;5)通过配置cluster-name实现同集群优先访问的负载均衡策略。文章提供了详细的配置步骤和效果验证,帮助开发者快速上手Nacos服务注册与发现功能。
2025-03-17 18:03:41
976
原创 SpringCloud 学习笔记1(Spring概述、工程搭建、注册中心、负载均衡、 SpringCloud LoadBalancer)
SpringCloud是一套基于Spring Boot的微服务开发工具集,提供分布式系统的一站式解决方案。文章首先介绍了集群与分布式、微服务的概念及区别,指出微服务强调细粒度拆分和专业化分工。接着详细讲解了SpringCloud的核心组件,包括服务注册发现(Eureka/Nacos)、负载均衡(Ribbon)、服务调用(OpenFeign)、熔断降级(Hystrix)等。文章还提供了工程搭建示例,展示了如何通过RestTemplate实现服务间调用,并引入注册中心解决硬编码问题。最后阐述了CAP理论在分布式
2025-03-14 22:48:15
1555
1
原创 博客系统笔记总结 2( Linux 相关)
: 表示把 “|” 前面命令的输出,作为"|"后面命令的输入。例:输入 ps -ef | grep “redis” 这条命令前半部分的含义是 查看当前系统上运行的所有进程。后半部分的含义是 查找 带 “redis” 的文件。组合起来就是 查找当前系统上运行的进程名字带 “redis” 的进程。apt 是啥呢?它就跟手机上的应用商店一样,你可以在上面下载各种软件。在 linux 中主要有两种下载软件包的方法,一个是去官网下载,另一个就是用 apt 下载。
2025-02-25 15:31:46
1553
1
原创 博客系统笔记总结(1)
token 不是加密的。token 不能伪造。在下图中,红色的是请求头(Header),紫色的是数据(Payload),蓝色的是签名(Signature)。Header : 描述 token 类型和签名算法。Payload : 携带的实际数据。Signature : 对 Header 和 Payload 的加密签名。token不能伪造的原因?token 之所以不能伪造,核心原因在于其数字签名机制。将 Header 和 Payload 用 Base64 编码。
2025-02-25 15:28:51
779
原创 解决出现:Field blogInfoMapper in com.example.springbootblog.service.impl.BlogServiceImpl required a bean
解决出现:Field blogInfoMapper in com.example.springbootblog.service.impl.BlogServiceImpl required a bean的问题
2025-02-19 19:37:54
472
1
原创 解决 .yml 文件中文乱码问题
但是按照下面的方法设置,以后就不会乱码了~到这里,只是把当前项目设置好了。已经乱码的恢复不了了。到这里就全部设置好了~本文到这里就结束啦~
2024-11-09 00:14:20
878
17
原创 算法: 链表题目练习
可以引入一个头结点便于处理边界情况方便我们对链表操作在插入新节点时,可以先把新节点的指针指向都调整好.然后再去调整前一个节点和后一个节点.或者直接新建一个指针,指向后一个节点,这样更容易操作~有时候会用到快慢双指针本文到这里就结束啦~
2024-11-05 17:26:30
1175
24
原创 JavaEE: 点亮你的JVM之旅(8000字、较全讲解)
在运行 Java 进程的时候,JVM需要读取 .class 中的内容,并且执行里面的指令。JVM需要读取 .class 中的内容,这个就是类加载,把类涉及到的字节码从硬盘读取到内存中(元数据区),也就是把这个 .class 中的指令变成类对象。基于类对象,就可以创建该类的实例。类对象其实就是“对象”的说明书 / 蓝本。因为有了类对象,所以才能进行反射,反射的各种 api 都是从类对象中拿到信息的。
2024-11-04 08:45:00
1353
16
原创 算法: 分治题目练习
下面的代码(快排主逻辑)多看几遍, 写熟.// 快排优化: 指定一个随机数作为基准值elsei++;归并排序很简单~把数组分成两个区间.分别给左右两个区间排序.合并两个有序数组.把排序后的结果还原到数组中.本文到这里就结束啦~
2024-10-22 17:31:55
3527
44
原创 算法: 位运算题目练习
基础位运算> 右移~ 按位取反. 记忆方法: 0 变 1, 1 变 0.& 按位与. 记忆方法: 有 0 就是 0.| 按位或. 记忆方法: 有 1 就是 1.^ 按位异或. 记忆方法: 相同为0,相异为一. 无进位相加.给一个数 n,确定它的二进制表示中的第 x 位是 0 还是 1.将一个数 n 的二进制表示中的第 x 位修改成 1.将一个数 n 的二进制表示中的第 x 位修改成 0.位图提前一个数 n 的二进制表示中的最右侧的 1n & - n。
2024-10-13 12:28:10
4728
41
原创 算法: 前缀和题目练习
我的第一反应是想用一个sum计算所有元素的和,然后除 2 得到 target,接着再使用滑动窗口寻找这个target , 发现行不通,因为数组中可能有负数和0~这一次 HashMap 中存的就不是数字出现的次数了,而是数字出现的下标.在往二维数组存数据的时候,内层循环用错了,应该用 m,而不是 n.因为数组中的元素有小于等于0的数,所以不能使用滑动窗口来解题~dp[i][j] 计算的是它左上方所有元素的和(包括自己)~在最后计算结果的时候,最开始没有算的太明白.没写出来,但是写了个大概,就差一点,
2024-10-11 00:24:02
2255
21
原创 JavaEE: HTTPS的魅力与优势揭秘
但实际上,事情没这么简单,我们知道,服务器在同一时刻会给多个客户端提供服务.这么多客户端,每个人用到秘钥必须是不同的(如果是相同的,那么秘钥也能被黑客拿到了~),因此服务器就需要维护每个客户端和每个秘钥之间的关联关系.这是一个麻烦的事情.你使用 Fiddle 的时候,Fiddle 就在对你进行中间人攻击(在开启 HTTPS 选项的时候,弹出来一个框,是否要信任 Fiddle 提供的证书,点击 Yes,表示你允许fiddle对你进行攻击了~).答: 这在理论上不可行!
2024-10-09 22:25:48
5240
14
原创 JavaEE: 深入解析HTTP协议的奥秘(3)
解决方案: 同时开发出多个不同版本的页面(有的只有文字图片,有的包含复杂多媒体),判断 UA 字段,通过 UA 获取到用户的浏览器信息和操作系统信息,这样就可以判定当前用户的浏览器版本都支持哪些特性,从而展示对应的页面.虽然不能直浏览器禁止网页接访问硬盘,但是浏览器允许通过键值对的方式来存储数据(这样的数据本质上也是在硬盘上),具体这样的键值对是如何存储到硬盘上的,浏览器封装好,网页本身无法干预.当年的上网设备,进化速度非常快,同一时刻,会有很多种不同的设备都在被各种用户使用.
2024-10-08 17:51:57
2403
19
原创 JavaEE: 深入解析HTTP协议的奥秘(2)
像 /?: 等这样的字符,已经被 url 当做特殊意义理解了.因此这些字符不能随意出现.如果某个参数中需要带有这些特殊字符,就必须先对特殊字符进行转义.一个中文字符由 UTF-8 或者 GBK 这样的编码方式构成,虽然在 URL 中没有特殊含义,但是仍然需要进行转义.否则浏览器可能吧 UTF-8/GBK 编码中的某个字节当做 URL 中的特殊符号.
2024-10-07 19:37:03
2184
19
原创 JavaEE: 深入解析HTTP协议的奥秘(1)
因为 1.1 版本就足够好用了,升级到 2.0 成本比较高(浏览器/服务器的兼容性),带来的收益有限.答: 体积小了,传输时消耗的带宽就低了,带宽是互联网中最贵的硬件资源,比 cpu,内存都要贵~HTTP 一般来说,GET 往往是不带 Body. POST 往往是带 Body 的.响应这里打开,看到的是二进制.(本身相应也是文本,此处的二进制,是压缩后的)HTTP不仅仅能传输文本,还能传输图片,传输音频文件,传输其他的各种数据.HTTP 协议,是一种典型的"一问一答"的协议.
2024-10-07 14:48:28
2318
15
原创 JavaEE: 数据链路层的奇妙世界
IP地址和mac地址,是两伙人,同一个时间段,各自独立搞出来的,两边都觉得自己的东西好,于是就综合一下,你这个地址负责这块,你那个地址负责那块就可以了~理论上来说,搞一套地址,也能完成宏观和微观上层次的所有工作,IP地址和mac地址留一组就可以了.但是实际上两个都留了下来,分配了不同的任务.最典型的就是IP协议,IP协议能拆包组包,其实IP协议的拆包组包,不是应对IP的64kb,更多的是应对MTU的限制.MTU和硬件直接相关,不同的硬件设备,就对应到了不同的数据链路层协议,也就对应到了不同的 MTU .(
2024-10-06 17:01:03
1493
13
原创 算法: 二分查找题目练习
可以使用二分查找.把区间划分成两个部分, 1. num[mid] < t , num[mid] >= t .把区间划分成 num[mid] < t 和 num[mid] > t ,这谁都懂,就不说了.关键是 “=” 给谁?左边还是右边?
2024-10-05 21:05:34
2223
10
原创 JavaEE: 探索网络世界的核心-IP协议
13位分片偏移: 是分片相对于原始IP报文开始处的偏移.其实就是在表示当前分片在原报文中处在哪个位置.实际偏移的字节数是这个值 * 8 得到的.因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了).我们知道,IP地址(IPv4)是一个4字节32位的正整数,那么一共只有2的32次方个IP地址,大概是42亿九千万左右.而TCP/IP协议规定,每一个主机都需要有一个IP地址.16位标识: 一个大的数据,拆成多个IP数据报传输,此时这多个IP的数据报的16位标识,就是相同的值.
2024-09-28 17:29:20
3049
26
原创 算法: 滑动窗口题目练习
做这道题时,脑子里大概有个印象,知道要用滑动窗口,但是对于滑动窗口为什么就对,不会落情况吗?对于这一点不是很清楚.看完题解,发现我的代码只需要把一个if改成while就能过了,而且速度很快…刚开始写时没写对,后来画了两次图,根据图,然后就写出来了~看了题解,跟我写的差不多,但是我写的还有可以优化的地方.
2024-09-26 15:30:44
2750
26
原创 MySQL: 数据类型介绍
DECIMAL(M,D) 不再使用IEEE754这一套了,而是自己设定了一套存储格式,自己设定的这个存储格式,相当于"变长的",付出了更多的空间,来使存储的数据更精确.其实MySQL的类型中也提供了"无符号类型",但是在MySQL官方文档中,明确说明了,不建议使用无符号类型.甚至无符号类型可能会在未来的更高版本的MySQL中被删除掉.如果接下来存储的数据都是5,6个字节这种,这时每个字段都是消耗50字节,实际上只用上了5,6个字节,剩下的都还空着呢!比如定义类型的时候,写作double(3,1).
2024-09-25 16:17:17
3142
19
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(六)
A触发超时重传,重传的数据,当然还是没有响应.反复多次之后,A尝试重置连接(rst),重置操作也没有ack,A就会单方面释放连接(A把保存的B的信息删除掉)存在很多种读法,但是实际上,aaa,bbb,ccc这才是正确的读法,aaa,bbb,ccc才是完整的"应用层数据包".这样的探测报文,是周期性的,同时这个报文是用来探测对方的"生死"的,也就把这样的报文称为"心跳包".而紧急指针,就是让后面的数据插队,根据紧急指针的偏移量,把指定位置的数据,优先发送出去.
2024-09-23 20:29:15
2594
23
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(五)
因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络的状态下,贸然发送大量的数据,可能导致雪上加霜.虽然有了TCP滑动窗口这个大杀器,能够高效可靠的发送大量数据,但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题.一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高,我们的目标是在保证网络不拥塞的情况下尽量提高传输效率~捎带应答是在延时应答的基础上,引入的提升效率的机制,它可以把返回的业务数据,和ACK两者合二为一.正常情况下,ack和响应,是不同的时机返回的,无法合并.
2024-09-23 00:35:35
2589
13
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(四)
窗口大小指的是无需等待确认应答而可以继续发送数据的最大值,上图的窗口大小就是4000个字节(四个段).发送前四个段的时候,不需要等待任何ACK,直接发送.操作系统为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答,只有确认应答过的数据,才能从缓冲区删掉.窗口越大,则网络的吞吐率就越高.
2024-09-22 17:49:14
2426
9
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(三)
给每个连接,都协商不同的起始的序号,如果发现收到的数据,和起始序号以及和最近收到的数据序号,都差别很大的话,那么就视为这个数据就是"前朝"的数据,把它丢掉.对于三次挥手来说,中间的两次,ACK+SYN,都是在系统内核中,由操作系统负责进行的,时机都是在收到SYN之后,就可以合并了.TCP通信时,起始数据的序号,就是通过三次握手,来协商确定的~(换而言之,TCP序号,并不是从1开始的)ACK是内核控制的,但是FIN的触发,则是通过应用程序,调用close/进程退出,来触发的.
2024-09-22 08:43:50
2256
12
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(二)
接收方有一个接收缓冲区,收到的数据先进入到缓冲区里,等后续再收到数据,就会根据序号,在缓冲区中,找对应的位置(排序),如果发现,当前序号1-1000这个数据,已经在缓冲区中存在了,那么就会直接把新收到的这个1-1000数据包丢弃掉~反之,如果重传几次,都没有顺利到达,这就说明网络的丢包率已经到达了一个非常高的程度,网络发生了严重故障,大概率没法继续使用了.发送方第一次重传,超时时间是 t1 ,如果重传之后,仍然没有ack,还会继续重传,此时的超时时间就变成了 t2.
2024-09-21 13:47:43
2350
19
原创 JavaEE: 深入探索TCP网络编程的奇妙世界(一)
16位校验和: 发送端填充,CRC校验.接收端校验不通过,则认为数据有问题,此处的校验和不光包含TCP首部,也包含TCP数据部分.为了解决上述问题,TCP就针对接收方收到的数据,进行了重新排序.确保应用程序读取到的数据一定是和发送方的数据顺序是一致的!收到的数据,就会先在接收缓冲区中排队等待,直到开头的数据到了,应用程序才能真正读取到里面的数据~虽然朋友先发的"好啊",后发的"不行,有事",但是网络传输过程中,可能存在"后发先至".当然不是,首先,TCP进行传输时,一次传输的基本单位不是一个TCP数据报.
2024-09-21 11:18:49
2722
12
原创 算法:双指针题目练习
一般是在数组中使用,通常需要对数组进行排序.数据要有单调性.使用双指针可以把时间复杂度降一维.O(n^3)变O(n^2)。
2024-09-19 18:57:19
1197
22
Web前端开发基础入门-张颖,书上全部代码
2024-11-11
使用Java实现平衡二叉树(AVL树)
2024-08-03
使用Java实现无头双向链表
2024-08-03
使用Java实现二叉搜索树
2024-08-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅