- 博客(138)
- 收藏
- 关注
原创 数据结构习题--删除排序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。
2025-07-26 19:51:08
169
原创 数据结构--反转字符串
摘要 该文章介绍了如何原地反转字符数组的方法。采用双指针技术,从数组两端同时遍历,交换对应位置的字符,直到指针相遇。这种方法只需O(1)额外空间,满足题目要求。Java实现通过while循环控制指针移动,使用临时变量完成字符交换,实现了高效的空间复杂度。
2025-07-21 16:30:51
174
原创 数据结构习题--杨辉三角形
本文介绍了如何用Java生成杨辉三角形。杨辉三角形的特点是每行首尾元素为1,其余元素等于上一行相邻两个元素之和。代码实现使用了双层循环:外层循环控制行数,内层循环处理每行元素,通过判断当前元素是否为行首/行尾来决定添加1还是计算相邻元素之和。最终返回包含所有行的二维列表。该算法的时间复杂度为O(n²),空间复杂度为O(n²),其中n为行数。
2025-07-21 16:30:34
240
原创 数据结构学习--队列/栈
本文介绍了队列和栈两种数据结构的特点与实现。队列遵循先进先出(FIFO)原则,包含队头和队尾指针。重点讲解了循环队列的实现方式,包括如何判断队列满的条件(rear+1 % QueueSize == front)和计算队列长度的公式(rear-front+QueueSize % QueueSize)。文中通过图示展示了不同情况下的队列状态,并指出实际编程中通常直接使用现成的队列API实现。
2025-07-20 09:00:13
256
原创 数据结构习题--合并两个有序链表
合并两个有序链表的摘要:本文介绍了两种合并有序链表的方法。第一种方法通过将两个链表分别作为主链表和插入链表,通过比较节点值大小进行插入合并,但实现较为复杂。第二种递归方法更为简洁,通过比较链表头节点值,将较小节点作为新链表头,并递归处理剩余部分。文中提供了完整的Java代码实现,包括链表节点定义和详细的合并逻辑。递归方法虽然理解难度较高,但代码更为简洁优雅。
2025-07-20 08:59:47
242
原创 数据结构学习--双指针
文章摘要 双指针是一种常见的数据结构技巧,主要分为两种类型:一种是两指针从两端向中间移动,另一种是两指针同向移动形成前后指针。这种技术广泛应用于各种算法问题中,如字符串反转、数组拆分、两数之和、元素移除以及寻找连续最大1的个数等场景。双指针方法通常能有效提升算法效率,是解决特定问题的实用工具。
2025-07-12 08:51:58
165
原创 数据结构习题--两数相加
本文讨论了两种解决链表两数相加问题的算法。第一种方法较为复杂,通过同时对两条链表进行操作来节省空间,但逻辑处理繁琐。第二种方法使用哨兵结点,新建链表存储结果,代码更简洁高效。关键点在于:1)处理空结点时返回0值;2)动态更新结点指针;3)最后处理可能的进位情况。第二种方法通过新建链表避免了原链表修改的复杂性,同时采用三元运算符简化了对空结点的处理逻辑,是更优的解决方案。
2025-07-12 08:51:21
301
原创 串口数据处理
当我们发送数字100时,按上文所说,100 被机器一位一位读取,虽说我们认为是发送的数字100,可是机器第一位读取 1,然后储存这个字符在 ASCII码表 中的对应值,而我们串口返回到上位机时,因为我们设置的是 ASCII码 接收,所以会把其存储的值转换为对应 ASCII码中的字符进行返回显示。而在使用此数据来接收串口的信息,无论我们发送的ASCII码,还是HEX,ASCII码经过程序(串口助手)后,会转换为其对应的十六进制发送给数据,而我们是按照二进制进行储存的,所以我们收到的是一个精确的数值。
2025-07-03 09:35:48
653
原创 方法引用和构造器引用
使用情景:当要传递给lambda体的操作,已经有实现的方法时,就可以使用方法的引用方法引用,本质上就是lambda表达式,而lambda表达式作为函数式接口,方法引用,也是函数式接口的实例使用格式:类(或对象)::方法名。
2025-04-19 18:07:14
170
原创 Java核心技术卷第三章
在 Java 中,每个句子必须用分号结束。特别需要说明,回车不是语句的结束标志,因此,如果需要可以将一条语句写在多行上。
2025-04-19 18:06:02
300
原创 Spring开篇
在使用 ClassPathXmlApplicationContext 获取到 xml 文件时,如下图所示,才是我们获取到的路径,是在out里面。在beanFactory中有一个beanDefinitionName,用来存放我们对象的名字。5.id属性表示该Java对象在spring容器中的id 通过id可以获取到对象。因为是数组,所以可以存放很多的bean对象信息,就是 bean.xml配置。在table里面找到我们已经创建好的一个对象。注意:这里使用的是spring的配置文件。
2025-04-17 21:27:35
284
原创 数据结构习题--岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。相当于连接到一块的1当作一个岛,完全被水包围的才算作是一个岛。
2025-04-17 21:27:03
247
原创 广度优先搜索--BFS
广度优先搜索(BFS)的一个常见应用是找出从根结点到目标结点的最短路径。在本文中,我们提供了一个示例来解释在 BFS 算法中是如何逐步应用队列的与树的层序遍历类似,越是接近根结点的结点将越早地遍历。如果在第 k 轮中将结点 X 添加到队列中,则根结点与 X 之间的最短路径的长度恰好是 k。也就是说,第一次找到目标结点时,你已经处于最短路径中。
2025-04-16 20:46:11
339
原创 模拟电路入门--绪论
这是我模电学习的学习笔记,首先对我来说我采用这种记笔记的方法来帮助我快速的定位到某个锚点,所以每一节都有非常精确的名字,其次,希望我的这份学习的合集能够帮助到有需要的同好。后面打算按照每一章节来书写笔记,而不是写一个超级大的版本。
2025-01-22 12:09:33
193
原创 Keil5的技巧
使用 ctrl + F 可以唤出一下界面,可以进行替换,在本文件查找,所有文件的查找,而且可以选择匹配大小写,精确匹配,正则表达式等方式。可以设置是否提示结构体成员,函数,并可以设置几个字符出现提示。也可以在上图红框处选择左右移和注释。
2024-09-28 17:11:37
660
原创 TIM--定时器
当下降沿到来的时候,发生第二次捕获,计数器 CNT 的值会再次被锁存到捕获寄存器CCR 中,并再次进入捕获中断,在捕获中断中,把捕获寄存器的值读取到 value3 中,并清除捕获记录标志。和上面一样,我们选用上升沿为周期采样的开始,当接收到上升沿信号时,会把 CNT 的值锁入到 CCR1 当中,然后从模式触发使 CNT 计数归为0,然后等到下降沿来临时,会把 CNT 的值锁入到CCR2当中,然后等待下一次上升沿到达,此时把 CNT 的值锁入CCR1中,同时从模式触发,使 CNT 归为0。
2024-09-28 16:22:40
1493
原创 C8T6--SPI读FLASH和双通信
本实验板中的 FLASH 芯片 (型号:W25Q64) 是一种使用 SPI 通讯协议的 NOR FLASH 存储器,它的 CS/CLK/DIO/DO 引脚分别连接到了 STM32 对应的 SPI 引脚 NSS/SCK/MOSI/MISO 上,其中STM32 的 NSS 引脚是一个普通的 GPIO,不是 SPI 的专用 NSS 引脚,所以程序中我们要使用软件控制的方式FLASH 芯片中还有 WP 和 HOLD 引脚。WP 引脚可控制写保护功能,当该引脚为低电平时,禁止写入数据。
2024-09-19 22:12:19
876
原创 SPI--原理
若对 SPI 通讯协议不了解,可先阅读《SPI 总线协议介绍》文档的内容学习。关于 FLASH 存储器,请参考“常用存储器介绍”章节,实验中 FLASH 芯片的具体参数,请参考其规格书《W25Q64》来了解。
2024-09-17 12:42:32
827
原创 C8T6超绝模块--USART串口通信
注意USART的引脚请自行查阅相应的数据手册本模块主要实现功能实现开发板与电脑通信,在开发板上电时通过 USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。
2024-09-09 22:35:43
770
原创 USART—串口通讯
串口通讯的物理层有很多标准及变种,我们主要讲解 RS-232 标准,RS-232 标准主要规定了信号的用途通讯接口以及信号的电平标准使用 RS-232 标准的串口设备间常见的通讯结构见下图在上面的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232 标准”传输数据信号。由于 RS-232 电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL 标准”的电平信号,才能实现通讯。
2024-09-08 16:22:38
1568
原创 C8T6超绝模块--EXTI
我们在前面使用读取按键的电压,根据返回值来执行小灯的系列操作,详情可见C8T6按键实现点亮小灯,而在这里,我们通过给按键配置一个EXTI中断,当产生中断时,就去中断服务函数里执行(注意:中断服务函数带有weak标签,可以直接进行重写,名字一定要写对,因为必须在中断服务列表当中)LED初始化在本专栏前面细讲过,这里就不过多赘述,请见C8T6超绝模块-点亮LED。
2024-09-08 10:44:00
663
原创 C8T6超绝模块--按键检测点亮LED
这里要注意的一点,有些板子在这里外接了一个电容器,当我们按下键位时,可以通过电容的充放电来实现硬件消抖,而如果没有外接电容器,当我们按下按键时,就会产生波纹抖动(高低电压变化不是一蹴而就的),导致按键没有达到我们预期的效果,我们要使用软件消抖(通过延时来判断电压,保证我们按下按键时,电压是处于稳定状态的)(这里针对的是我的板子的原理图,具体的查看自己的板子)注意看,这里按键一端接到的是地,当我们没按下按键时,其默认是低电压,当我们按下按键时,电路连通时,这是高电平。里面有具体的阐述,这里就不一一介绍了。
2024-09-04 11:00:10
789
原创 C8T6超绝模块--LED
注意:具体打开哪个时钟还是要通过查阅数据手册,看我们需要初始化的外设具体在哪个线程上,我们这里端口GPIOC在APB2的线程上,所以调用的是APB2时钟的打开函数。如图一边接入的是3.3V的外接电压,而我们需要电流流过需要PC13是低电压,这样有电势差才会使产生电流让小灯亮,初始化时我们一般控制默认接入高电压,使其不亮。首先不同的芯片的接法不一样,需要自己查看自己的芯片的原理图,我使用的是C8T6,使用的PC13接入的LED。下面是LED灯的GPIO的初始化函数。其实,灯的亮灭是通过高低电压来控制的。
2024-09-04 10:10:15
730
原创 WWDG—窗口看门狗
窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0X40时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值在减到某一个数之前喂狗的话也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义(只是在递减的过程中分了一块窗口区,只有在窗口的范围里才能进行喂狗操作)
2024-09-02 13:20:30
848
原创 IWDG—独立看门狗
独立看门狗用通俗一点的话来解释就是一个 12 位的递减计数器,当计数器的值从某个值一直减到 0 的时候,系统就会产生一个复位信号,即 IWDG_RESET。如果在计数没减到 0 之前,刷新了计数器的值的话,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍能工作。
2024-09-01 14:43:58
417
原创 嵌入式--通信的基本概念
而并行通讯一般是指使用 8、16、32 及 64 根或更多的数据线进行传输的通讯方式,,并行通讯就像多个车道的公路,可以同时传输多个数据位的数据,而串行通讯,而串行通讯就像单个车道的公路,同一时刻只能传输一个数据位的数据。在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通讯中会包含有帧的各种标识符,所以同步通讯的效率更高,但是同步通讯双方的时钟允许误差较小,而异步通讯双方的时钟允许误差较大。而码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。
2024-08-02 11:44:06
368
原创 GPIO--位带操作
在 STM32 中,有两个地方实现了位带,一个是 SRAM 区的最低 1MB 空间,另一个是外设区最低 1MB 空间。这两个 1MB 的空间除了可以像正常的 RAM 一样操作外,他们还有自己的位带别名区,位带别名区把这 1MB 的空间的每一个位膨胀成一个 32 位的字,当访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的。
2024-08-01 10:01:09
1064
原创 DMA简介--配置
外设的数据宽度由 DMA_CCRx 的 PSIZE[1:0] 配置,可以是 8/16/32 位,存储器的数据宽度由 DMA_CCRx 的MSIZE[1:0] 配置,可以是 8/16/32 位。在 DMA 控制器的控制下,数据要想有条不紊的从一个地方搬到另外一个地方,还必须正确设置两边数据指针的增量模式。外设的地址指针由 DMA_CCRx 的 PINC 配置,存储器的地址指针由MINC 配置。
2024-08-01 09:59:12
2194
原创 GPIO--按键检测实战
在编写按键驱动时,也要考虑更改硬件环境的情况。我们把按键检测引脚相关的宏定义到“bsp_key.h”文件中// 引脚定义当然这是根据不同的硬件设施来写操作的端口和引脚,具体哪个端口和引脚请自行查阅手册。
2024-07-20 20:27:19
1083
原创 断言和注释规范和编译技巧
当这个头文件被同一个文件第二次“#include”包含的时候,由于有了第一次包含中的“#define __LED_H”定义,这时再判断“#ifndef__LED_H”,判断的结果就是假了,从“#ifndef”至“#endif”之间的内容都无效,从而防止了同一个头文件被包含多次,编译时就不会出现“redefine。“bsp_led.h”文件中使用了“#include“stm32f10x.h””语句,按习惯,可能我们写主程序的时候会在 main 文件写“#include“bsp_led.h”
2024-07-20 11:52:48
611
原创 使用库函数新建工程
如图在 F1 标准库工程组织中的 CMSIS 部分的 core_cm3.c 实际是不需要的,是否留在工程里面没有任何影响,所有例程中都没有使用到它,此文件为官方库保留,已被其他代替。在新建的工程中添加 5 个组文件夹,用来存放各种不同的文件,文件从本地建好的工程文件夹下获取,双击组文件夹就会出现添加文件的路径,然后选择文件即可。注意这个配置很重要,后续出现仿真器检测不到,出现编译,下载的问题的原因基本都在这里。在新建的工程中添加这些文件,双击组文件夹就会出现添加文件的路径,然后选择文件即可。
2024-07-20 11:09:22
1000
原创 新建工程时的文件及常见错误
_main 其实不是我们定义的 (不要与 C 语言中的 main 函数混淆),这是一个 C 库函数,当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统环境,并在函数的最后调用用户编写的 main 函数,从此来到 C 的世界。名为“startup_stm32f10x_hd.s”的文件,它里边使用汇编语言写好了基本程序,当 STM32 芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起 C 语言的运行环境,所以我们把这个文。”,相当于 C 语言的。
2024-07-19 19:52:28
650
原创 GPIO简介
GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚。
2024-07-19 18:25:26
1240
原创 什么是寄存器
说明中的 ODRx 是另一个寄存器的寄存器位,我们只需要知道ODRx 位为 1 的时候,对应的引脚 x 输出高电平,为 0 的时候对应的引脚输出低电平即可 (感兴趣的读者可以查询该寄存器 GPIOx_ODR 的说明了解)。首先这个芯片上一块连续的内存,其中又分为了几个区间进行不同的操作功能,对于其中的某一个区间如block2,是来操作外设的,而外设又根据速度不同划分APB1,APB2,AHB几个部分,而在这块block区,内存也是连续的,不同的功能对应的内存不同,所以可以通过想对偏移,来找到绝对地址。
2024-07-19 16:12:08
1238
原创 认识STM32
认识STM32大纲认识STM32具体案例认识STM32STN32有什么STM32的分类和命名方法STM32的选择引脚的定义,分类和查询制作PCB
2024-07-16 21:20:46
246
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人