- 博客(85)
- 收藏
- 关注
原创 FastAPI基础入门
本文介绍 FastAPI 的基础使用,从创建项目、启动服务和路由注册开始,逐步讲解路径参数、查询参数、请求体、数据校验、响应类型、响应模型及异常处理。通过实际代码示例和交互式文档演示,了解如何使用 FastAPI 编写简单的 Web API,并掌握接口开发中的常见操作。
2026-10-30 20:20:47
233
原创 leetcode-239. 滑动窗口最大值
移除所有比当前元素值小的元素,而不是仅仅移除最后一个。移除之后窗口内的元素都是合法的,然后更新答案,队头就是当前窗口最大的元素。遍历到一个元素,和队尾的元素进行比较,如果队尾的元素比当前元素要小,就移除去。通俗点说,就是当前这个数索引更大,在窗口更靠后,和前面的元素相比,可以存在更久的时间,那么那些索引更小,值也更小的元素就没有价值了。还有一个细节就是要注意队列里面,我们存的应该是数组的索引,而不是具体的值,如果存具体的值,后续就不知道这个数字的索引是否合法了,而存索引,我们依然能根据索引找到对应的值。
2026-07-17 12:20:33
203
原创 海光 DCU 性能分析实战:用 hipprof 从 API、Kernel 到 PMC 定位 PyTorch 瓶颈
hipprof 最有价值的地方不是生成一张很复杂的时间线,而是把“感觉模型慢”拆成可以验证的问题:主机在分配还是发射,设备在 GEMM 还是 copy,某个 kernel 是计算、缓存、LDS 还是寄存器受限,以及一个微优化最终能不能落到整模。在本文的气象 Transformer 中,真正改变方向的是 direct-copy 占比,而不是某个漂亮的峰值算力数字。
2026-07-17 12:18:41
915
原创 leetcode-1438. 绝对差不超过限制的最长连续子数组
这个题目看到要找一个最长连续的子数组,就可以知道肯定是要用滑动窗口的,但是我们不能简单的套用滑动窗口的模板,题目的一个限制是,窗口内的最大元素减最小元素的差值要小于等于limit。如果我们每次都对窗口求一次最大最小值,时间复杂度就$O(N)\times k$,k是窗口的长度,在这个题目是需要超时的。239题缩小窗口是可以用if的,因为是定长的,每次最多就缩一次,但是这里一定是需要用while的,有可能移除了一个元素之后,依然是不符合条件需要继续缩小的。缩小完之后的窗口一定是符合条件的,更新答案就可以了。
2026-07-16 14:04:10
175
原创 leetcode-179. 最大数
既然全局来看很复杂,能不能考虑局部,使用贪心的策略来解决,假如现在只有A和B两个数字,就有两种拼法,分别是A+B和B+A,如果$A+B>B+A$,那么最后拼的顺序,A一定是在B前面的,然后拓展到3个数字A,B,C,如果A比B大,A也比C大,A就应该在最前面,然后B和C比,C更大的话C就应该在B前面,拼的顺序就是ACB。这个题,如果用简单的数字进行比较,肯定是行不通的,例如样例2的输入[3,30,34,5,9],如果单纯比较大小,30比9大,但是930反而是比309更大的。就得到了最终的答案。
2026-07-16 14:03:18
173
原创 海光 DCU 自定义算子完整实战:用 PyTorch + HIP 融合 bias 与 GELU
在海光 DCU 上写出一个能编译的 HIP kernel 并不难。真正费时间的是把它变成一个不会因为 stream、缓存、异步计时或输入边界而给出错误结论的 PyTorch 扩展。先定义数学语义-> 写最小 HIP kernel-> 接入当前 stream-> 建立内容寻址缓存-> 数值回归-> 同步微基准-> 真实模型 A/B如果微基准没有收益,就应尽早停止;如果微基准有效而整模无收益,就回 profiler重新判断热点占比。自定义算子的目标不是让项目里多一个.so,而是用可验证、
2026-07-16 13:56:28
848
原创 leetcode双指针经典练习题
不过这种写法其实感觉还是有点绕的。还有另外一种更简洁的写法,这里的slow代表的是即将写入的位置,不在有效区间,然后我们判断slow-2的位置和fast的位置是不是相同,因为值是连续的,如果相同的话,说明slow-1也是这个值,slow-2也是这个值,已经有两个了,那就不符合条件了,如果不相同,那就添加进去。这里代码的意思就是,先进行判断,fast的值和slow的值是不是相同,不相同那就要添加进去,相同的话再考虑有没有超过2个,不超过2个就添加进去,超过2个就跳过,然后这里还需要判断slow<fast。
2026-07-16 12:38:14
211
原创 从零跑通海光 DCU:DTK、PyTorch、HIP 扩展与 hipprof 的完整配置实战
真实项目往往不是独立 C++ 程序,而是希望在 PyTorch 图中替换某个热点算子。这里采用 source-only 方式:正文只提供源代码,由目标机器现场编译,不依赖提前生成的.so二进制。当前 PyTorch 扩展流程会优先使用 Ninja。若镜像缺少它,应从平台软件源或当前Python 环境安装 Ninja,而不是为了补一个构建工具去整体升级 Torch。示例add_ext.cpp pybind 接口add_ext_kernel.cu HIP kernel 与张量检查。
2026-07-16 12:31:32
1018
原创 数据库笔记-0-MYSQL安装
官网地址:https://www.mysql.com/cn/点击导航栏的Download划到网页最下面,点击MySQL Community (GPL) Downloads »点击MySQL Installer for Windows点击Download,可以直接下载内存比较大的那个,直接安装即可。如果提示你登录账号,点击No thanks, just start my download即可跳过。
2025-11-30 19:30:09
399
原创 (10)普中A2 51单片机DS1302实时时钟
引脚名作用VCC2主电源VCC1备用电源GND电源地X1、X232.768KHz晶振CE芯片使能IO数据输入/输出SCLK串行时钟我们在使用单片机进行计时,假如断电了,下次再开机就会重新计时。但是DS1302有备用的电源,就算单片机断电了,依然可以正常计时。下次单片机通电后再读取数据就可以了。晶振使用32.768KHZ和我们使用11.0592HZ进行串口通信是一个道理,在某些方面精度会更高。我们只需要对这些寄存器进行读写,就可以读时间,和修改时间了。
2025-11-30 15:53:55
1757
原创 (9)普中A2 51单片机LED点阵屏
LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。
2025-11-28 14:20:36
554
原创 leetcode2073. 买票需要的时间
这个只需要用一个while循环作为外层循环。只要k位置的人没有买完就一直执行。内层就遍历tickets即可。虽然排队要求第一个人买完去最后面排队,但是你遍历完再从头遍历,效果是一样的,然后遍历的时候看当前位置是否为0,不为0的话就让时间加一秒,让这个位置的票数减一。如果为0的话,看是不是目标位置,是的话就可以直接返回时间t了,如果不是就什么也不做,去遍历下一个元素。
2025-11-27 16:43:50
243
原创 leetcode20. 有效的括号
但是在出栈之前也要检测一下栈里是否有元素,没有元素说明就不匹配。直接返回False即可。如果遍历完,然后再看栈里面是否还有元素,如果还有元素说明也不是有效字符串,如果没有元素,说明就是有效字符串,返回True即可。很经典的栈的练习题。我们只需要把输入看作是一个栈。然后遍历字符串,如果是左括号就入栈,如果遇到右括号,就将左括号出栈,看是否匹配,如果不匹配说明字符串不有效。
2025-11-27 16:14:12
215
原创 leetcode704. 二分查找
二分查找,很简单基础的算法。思想就是定义一个左指针,一个右指针,然后让目标值和这两个指针的中间值进行对比,如果说目标值比中间值大,说明左指针需要移动到中间值的地方,如果目标值比中间值小,说明右指针需要移动到中间值的地方,如果目标值刚好等于中间值。当然,二分查找还有一个重要的前提就是目标序列必须是有序的才可以。而查找的结束条件就是左指针在右指针的右边,说明就没有符合条件的元素。
2025-11-27 12:04:22
218
原创 leetcode1. 两数之和
这个题我看到的第一时间想到的就是哈希表,我们只需要遍历数组,然后用目标值减去当前值,看这个数在哈希表里面有没有,有的话说明就找到了。因为题目说了一个元素肯定不能是重复使用的,先把全部元素都放进去就会出现比如目标值是6,用两个3+3就实现了。这个题还有更简单的方案就是暴力破解了,两层循环,让所有的数字两两组合,看它们的和是否和目标值相等,但是效率肯定会很低就是了。因为我们要找那个数,肯定是作为键查找速度更快,找到了值就是我们要的下标了。所以我们要一边遍历,一边查找,如果没有,就把当前元素插入哈希表里面。
2025-11-27 12:03:53
127
原创 leetcode217. 存在重复元素
这个问一个数至少出现两次就返回true,否则返回false,我们可以想到集合可以去重,假如把这个数组转换成集合,然后集合的长度和数组的长度是一样长的,那么就说明没有重复的元素。如果不一样长,就说明有重复的元素,直接返回true即可。还有一种策略是可以利用哈希表,遍历数组,把数组的值作为键,把出现的次数作为值,发现某个数字出现的次数大于1的时候,可以提前结束循环,效率会高一点。
2025-11-27 12:03:40
217
原创 leetcode136. 只出现一次的数字
这种需要统计的题目,很明显就是使用哈希表,统计每个数出现的次数,然后再遍历一遍哈希表,查看出现次数为1的数,就是我们要找的数字了。当然我这个并不是速度最快的,但是我觉得可能会更容易理解一点,社区有利用异或运算符的写法,效率会高很多。
2025-11-26 20:40:27
261
原创 leetcode1015. 可被 K 整除的最小整数
这可以大大提高速度,因为取模的运算效率和加减来比是慢很多的。被2整除的数字就不用多说了,一个偶数乘以任何数肯定还是偶数。个位数一定是5或者0,当然也不可能找到全为1组成的数来整除它。看到这个题,我们可以简单的想到就是用一个无限循环。求1能不能整除k,11能不能整除k,111能不能被k整除.........以此类推。但是我们需要考虑不存在这样n的数字就返回-1的情况。我们只需要用k对2和5取模,能被2和5整除的一定找不到。然后是c++版的,c++不用多说,效率是很高的,同样的逻辑很轻松就0ms通过了。
2025-11-26 16:47:39
191
原创 C++笔记-36-STL常用算法
和上面的函数一样,需要在求并集之前给vtarget指定一个大小,我们要考虑最大的情况,就是两个集合没有重复的元素,所以要开辟的空间是两个集合大小的和。函数原型:set_intersection(iterator begl,iterator end1,iterator beg2,iterator end2,iterator dest);函数原型:set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
2025-11-26 16:17:47
887
原创 C++笔记-34-map/multimap容器
本质:map/multimap属于关联式容器,底层结构是用二叉树实现。优点:可以根据key值快速找到value值。
2025-11-24 09:21:12
602
原创 C++笔记-33-set/multiset容器
编译器不知道自定义数据类型怎么排序,自定义数据类型必须指定排序规则,否则插入会直接报错。一样是利用仿函数指定规则。public:it!= st.end();
2025-11-23 20:18:30
959
原创 leetcode1041. 困于环中的机器人
然后count我一开始也弄的比较大,是100,但是最后发现10也可以通过。然后while内部的for就是执行输入的指令,如果是“G”就判断下当前的方向,对x和y进行对应的操作,如果是“L”或“R”就放到direction函数改变方向。我先解释下每个变量,其中s就是原本输入的字符串,我觉得太长了就替换了,然后x,y就是当前的坐标,count是一个循环的次数。就是重复执行多少次指令,如果还没有成一个环,就可以判定机器人无法回到原点,flag代表的是方向,0是北,1是东,2是南,3是西。返回改变之后的方向。
2025-11-22 11:25:02
489
原创 2025.11.22力扣每日一题
只需要遍历一遍数组就可以了。用一个count统计要进行多少次操作,判断这个数对3取模是否为0,不为零就让count加一就可以了。因为当这个数对3取模为1的时候,可以减一,就能整除3,对3取模为2的时候可以加一,也可以整除3,也就代表不能被3整除的都是只需要进行一次操作就可以了。
2025-11-22 10:59:26
246
原创 C++笔记-32-list容器
功能:将数据进行链式存储链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的STL中的链表是双向循环链表,尾部结点的指针域指向头部,头部节点的指针域指向尾部。由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向选代器总结:STL中List和vector是两个最常被使用的容器,各有优缺点。
2025-11-21 20:59:57
936
原创 数据库笔记-1-SQL语言之DDL
删除指定表,并重新创建该表。USE 数据库名;查询当前数据库所有表。查询指定表的建表语句。修改字段名和字段类型。
2025-11-21 20:59:25
341
原创 一本通网站2045:【例5.13】蛇形填数
还有一个小细节就是不能写四个if,而是下面的写else if,否则就可能存在什么情况呢,就是上面修改了flag,然后刚好满足下面的if条件,又带着修改了x和y,最后的结果也会有问题。但是我的第一版代码写的时候发现,碰壁的条件是什么?我们初始化二维数组的所有值都为0,那么就有两种情况,一种是4这种情况,到了边界,需要拐弯,一种是12这个位置的情况,右边已经被填充过了。为什么0,1,2,3对应的是下左上右呢,我觉得是便于我理解的,因为一开始是从右上角往下走,然后左拐,然后上拐,然后右拐,这样思路比较连贯。
2025-11-20 20:19:27
515
原创 C++笔记-31-stack容器和queue容器
stack是一种先进后出(First In LastOut,FILO)的数据结构,它只有一个出口栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为可以类比弹匣,羽毛球筒等,先进后出,因为先放进去会压在最下面,它想出来就需要上面的出来才行。
2025-11-20 20:09:19
499
原创 C++笔记-30-deque容器
双端数组,可以对头端进行插入删除操作deque的工作原理是deque有一个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据,中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间.deque容器的迭代器也是支持随机访问的。
2025-11-19 09:30:01
765
原创 C++笔记-29-vector容器
/容器预留len个元素长度,预留位置不初始化,元素不可访问。//将[beg,end)区间中的数据拷贝赋值给本身。如果我们事先确定要用很多元素,就可以使用reserve,可以提高一定的效率。//将n个elem拷贝赋值给本身。swap(vec);//将vec与本身的元素互换。减少vector在动态扩展容量时的扩展次数。
2025-11-19 09:29:21
719
原创 C++笔记-28-string容器
特点:string类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete替换replace,插入insertstring管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。
2025-11-18 20:08:12
479
原创 (8)普中A2 51单片机串口通信
标题一串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
2025-11-14 17:00:23
1473
原创 一本通网站2050题:【例5.20】字串包含
这个题目我的第一想法就是按照题目的要求,不断的把原来的字符串循环移位,然后判断是不是字串,但是这样的效率很低下,一些边界地方还容易出错,后来想到了一个比较好的方案就是。让s3=s1+s1,什么意思呢,就是让这个串和这个串拼接。那么是不是能在拼接之后的字符串里面找到任意一个s1循环移位之后的一个字符串?然后再去判断s2是不是s3的字串。这个思路也是非常的巧妙,笨拙按照题目要求来,效率低下还容易出错,用这种方案就可以很容易的解决了。
2025-11-12 18:12:45
183
原创 C++笔记-26-类模板
局限性:模板的通用性并不是万能的例如判断两个数是否相等的模板,假如传入的是一个Person类,或者一个数组,就会出问题了。因此C++为了解决这种问题,提供模板的重载,可以为这些特定的类型提供具体化的模板。
2025-11-12 15:32:26
805
原创 一本通网站1140:验证子串
这个题利用c++里面string库的string类的find方法很快就能解决了,只需要判断s2是不是s1的字串,是的话就打印,不是的话再判断s1是不是s2的字串,如果谁也不是谁的字串。最后就直接打印“No substring”
2025-11-12 12:30:15
264
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅