- 博客(18)
- 收藏
- 关注
原创 哈希表+前缀和+滑动窗口高效查找——蓝桥杯例题
我们以第i个字母为起点,对起点左侧的字母我们不再关心了,因为不管左侧的字符串是否出现相同的字母,反正该字母的贡献值已经为1了(因为这个字母已经出现了),现在我要关心的是这个字母的贡献何时失效。从第i个位置往后看,当没有再次出现相同字母时,这个字母对这些子串都是有贡献的,但是如果再次出现了这个字母,那么这第i个字母就失效了,因为已经出现了第二个相同的字母,但是f的值仍然为1。因为哈希表中的字母都是不一样的。我们看题目要求,题目的f(子串)的值是只出现一次的字母的数量,所以我们关心的还是相同字母。
2025-04-03 13:52:06
737
原创 贪心算法——思路与例题
那么如何实现呢,具体就是对于第一个国家,那么这个值就是a-b-c,对于第二个国家,这个值就是b-a-c,对于第三个国家,这个值就是c-a-b,可以看出,其实就是相对值,也就是这个事件发生时,对第一个国家,第二个国家,第三个国家的胜利的贡献值。那么我们应该倒序考虑,这样我们可以选择的巧克力种类才最多,因为在第x天时,我们选择的巧克力的保质期一定是大于等于x的,这就意味着,当在1—x天里的任意一天时,可以选择的巧克力种类最多。题目分析:现在一共有n种巧克力,每种巧克力包含三个信息:价格,保质期,数量。
2025-03-24 19:31:03
2014
原创 糊涂人寄信——递推
当有三封信时,我们可以先拆解问题,假设第一封信装错了位置(有两种可能),那么就还剩下2封信要装错位置,而两封信要装错的类别我们也已经求解得知了,所以这里3封信要装错位置的类别数就为 第一封信装错位置的可选择数+剩下的信的装错总类别。思路分析:当有n封信,n个信封时。第k封信没有装在第k个信封里(k从1~n),就算所有的信封都装错了。我们可以得知的是,当有1封信,时,装错类别数为0。当有两封信时,装错类别为1。要装错一共分为两个大类。
2025-03-21 22:37:44
230
原创 DFS算法例题
这里剪枝的条件就是sum>n(当总克数已经超过n值时,直接退出即可),以及这里要注意一点:总克数有可能等于n了,但是并不是每一种配料都用上了(根据题意可知十种配料都需要用上),所以当种克数到达n时,还需要再判断一下x是否是小于等于10(当x等于11时才是十种配料都选上的情况)。代码分析:要注意怎么样把顺序和排列数搭配起来,这里我们可以在递归的同时也进行查询,这样就可以保证排列数顺序的及时输出,也就是说,当我们查询到目标数值时,直接输出顺序,这个顺序就是表示这个排列数的大小。
2025-03-18 21:41:07
291
原创 深度优先搜索(DFS)算法
回溯到第三个位置,恢复现场(将第三个位置的数字清零),继续判断第三个位置还可以放哪些数字。继续判断第三个位置,第三个位置起始数为3,则++后i变为4,将4存入第三个位置,输出结果134,然后回溯到第三个位置,恢复现场后,继续循环判断i++为5,将第5放入第三个位置后,回溯到第三个位置,恢复现场后i++变为6,退出函数,回溯到第二个位置,从起始数2开始,因为先前是由i=3进入递推的,所以这里回溯到原来位置后i仍然为3,循环++后i=4,将4放入第二个位置,继续判断第三个位置......依次类推。
2025-03-09 21:25:23
681
原创 线性表的查找——二分法(折半查找)
来说,我们需要设置三个指针变量来查找数据,指向队列的第一个数据——头指针(low),指向队列的最后一个数据——尾指针(high),指向队列的中间数据——mid指针。当key>mid时,high指针指向mid的前一位数据(high=mid-1)。再次将key与mid进行比较,如图所示,key>mid时,将low指针移位到mid的后一位(low=mid+1)对于这组有序队列来说,要查找的数据是63(key=63),此时key>63,则low=mid+1。再次对比key与mid,发现key等于mid,循环结束。
2025-03-03 21:14:55
321
原创 STM32入门之DAM数据搬运
上图可以看到,左上角为核心区,也就是cpu,总线矩阵的右侧都是存储器(外设寄存器也是一种特殊的存储器),这个框图就只有两个部分,即CPU和存储器,在总线矩阵的左侧是主动单元,可以对存储器进行操作的,右侧都是被动单元。图中可以得出,DMA1有7个通道,DMA2有5个通道,他们都可以访问被动单元的存储器。这里还有一点要注意的,如果你的ADC使用了单次模式,那么DMA就不要用自动重装器了,如果ADC使用了连续模式,那么DMA就使用自动重装器,这样子搭配起来,才能有时效性,正确性的读取到数据。只需要稍加改动即可。
2024-10-10 22:10:08
915
原创 STM32之DAC部分
首先通过左下角的译码器给ADDA、ADDB、ADDC写入数据就可以选择我们需要的通道了,一共有八位通道,选择好之后,通道选择开关就会打开对应的通道,把电压值读取到电压比较器的引脚1,而电压比较器的引脚2是接入到DAC的,这个DAC可以把一个数据转化为电压信号,然后电压比较器会不断对比两者的电压值,这个比较过程我们用二分法来实现,也就是说,这个八位的寄存器满程是256,先对半分为64,然后比较,如果寄存器数据大了就再对半分为32,这样依次二分,就可以最快找到电压值相等时的数据了。运算放大器有四个运用场景。
2024-10-08 20:24:36
1640
1
原创 STM32入门之定时器编码器部分
由上图可知,编码器接口是接入了定时器的通道1与通道2,这里就把编码器的A相接到通道1,编码器的B相接到通道2,通过滤波、边缘检测后的TI1FP1与TI2FP2就会接到编码器接口部分,这里的编码器信号就会被接入到时基单元来驱动时基单元工作,CNT会根据A、B相的信号来具体实现CNT自增与自减,清零。我们一般使用模式3来测速,因为模式3的测量频率更高,精度也更高,同时,利用模式3,还可以很好的去除一些毛刺影响。还是一样的,我们先写驱动函数部分,我们使用定时器2的通道1与通道2。这里的编码器有3种工作模式。
2024-09-28 10:00:00
1831
原创 STM32入门之定时器输入捕获部分
观察以上框图得知,其实只是变动了右下角的一部分,也就是多了TI1FP2信号的输入,这里TI1FP2会捕获到上升沿与下降沿之间的CNT值,并锁存到CCR2中,但是这个捕获并不会触发计数器清零,所以计数器仍然会继续计数,直到下一个上升沿来临,CNT值锁存到CCR1中,计数器清零。通道1测频率,通道2测占空比。IC输入捕获,与输出比较一样也有有四个通道,分别与输出比较共用4个CCR寄存器,通过通道输入电平信号,我们可以检测到电平跳变,然后将CNT的值锁存到CCR寄存器中,实现测量频率,占空比,用于电机测速等。
2024-09-25 21:23:33
906
原创 STM32入门之定时器输出比较部分
首先来介绍一下舵机,舵机是一种根据PWM信号占空比来控制输出角度的装置,根据舵机型号的不同,驱动它转动角度所需要的占空比也不同,例如SG90型号的舵机,需要我们输入周期为20ms(50HZ),占空比为2.5-12.5%的PWM波才可驱动舵机转轴,当占空比是2.5%时,舵机输出角度就是-90°,当占空比是5%时,舵机输出角度就是-45°,当占空比是7.5%时,舵机输出角度就是0°......以此类推舵机有三个输入线,一根接电源,一跟接地,一根是信号线输入PWM波。反转时,给PA4置低电平,PA5置高电平。
2024-09-20 21:35:41
1269
原创 STM32单片机入门之定时器理论篇
假设这里我们要实现定时器2与定时器3的级联,就可以先初始化定时器3,使用主模式,把定时器3的更新事件映射到TRGO上,然后再初始化定时器2,选择定时器2的ITR2引脚作为外部时钟源,最后再选择模式为外部模式1,这样定时器3的更新事件就可以驱动定时器2的时基单元了,实现了定时器2与定时器3的级联。通用定时器除了最基本时基单元外,还多了内外时钟源选择,输出比较,输入捕获模块,编码器接口模块,不过值得一说,通用定时器的时基单元的计数器可以选择向上计数,向下计数,中央对齐计数模式。
2024-09-18 21:33:32
1084
原创 STM32单片机入门之外部中断(EXTI)实践部分
当逆时针旋转时,A信号为上升沿时,B信号为高电平,A信号为下降沿时,B信号为低电平。,这里我们希望在中断函数里面实现Count_Sensor_Count自增的功能,每当遮挡一次,就加1,用Count_Sensor_Count++实现,这里还需要注意的是,因为我们使用的线路14是与10-15线路共同使用一个通道的,所以这里还需要判断一下是不是线路14的中断源有信号了,这里可以通过访问挂起寄存器,看看对应线路的标志位是否被置1了,如果被置1了,说明就是线路14的中断源有信号跳变了。那么就到了代码部分。
2024-09-15 20:27:07
1049
原创 51单片机最小系统——复位电路分析
当直流电源给电容供电的瞬间,还是会有少量电子往极板上移动产生一定的电流,但是这个过程十分快速,可能是1/1000秒就充电完成了,这个速度是十分快的,我们无法观察到,因此才说电容隔直流,但是用交流电给电容供电的时候,因为交流电的方向是不断变化的,因此会不断产生充电、放电电流,这看起来就是“通”交流的,这里还有一点需要注意,如果交流电的方向变化速度没有充电速度快,那么即使是交流电供电,电容也是不“通”的,也就是说,当充电完成后,电压方向还没有变化,实际上就和直流电原理一样了,我们观察不到电流。
2024-09-13 21:22:46
1428
原创 STM32单片机入门之外部中断(EXTI)理论框架篇
中断是单片机中一个重要的功能,我们可以利用中断功能来接受到许多突发性的信号,从而精确的捕获到引脚电平的跳变,这个特殊的功能可以减轻程序的执行负担,不用在主循环里一直做一些没有意义的重复判断,如果主程序一直在做这些重复判断,那么主程序就无法做其他事情了,因此,中断功能就出现了,用来帮助我们高效地完成信号检测与接收等功能。首先要了解中断的执行流程,在主程序执行的过程中,如果出现了中断源(例如电平信号跳变),那么就会停止运行主程序,转而跳到中断函数中执行中断函数,执行完后再返回主程序。(例如触发ADC转化)
2024-09-11 21:13:50
925
原创 51单片机利用三极管驱动LED灯电路分析
也就是说,加了这个下拉电阻后,当我们停止高电平信号时,LED灯可以灵敏快速熄灭,反之,如果不加这个下拉电阻,当我们停止这个高电平信号,LED灯会因为信号干扰而持续点亮,然后才会慢慢熄灭,也就是不那么灵敏。当IO口输出高电平时,基极会产生电流,减去R1的压降后任然是大于0.7V(Ube导通的压降条件),又因为经过R3和LED灯的压降后,一般集电极的电压就为0V了,此时Ubc肯定是大于0的,也就是正偏导通的状态,此时两个PN结都是正偏导通的状态,也就是三极管工作在。这里的三极管可以形象的理解为一个。
2024-08-28 18:40:03
4104
2
原创 51单片机最小系统——复位电路分析
我查阅资料得知高于1.5的电压信号就算是高电平,低于1.5的电压信号就是低电平。在复位电路图中可知,当我们上电瞬间,电容会慢慢充电,此时的电压变化是0—5V,由于电阻和电容是串联的关系,所以电阻的电压变化就是电容的逆过程,即5—0V。所以电平信号就是高电平—低电平的变化,由于这款单片机的复位功能是高电平复位,所以在上电瞬间,就会复位一次。那么如果我们想实现复位多次呢?所以这里的RST电平信号可以当作是电阻的电压值信号我们只分析电阻的电压值变化就可以知道RST引脚的电平信号变化是如何的了。
2024-08-25 17:19:08
1311
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人