- 博客(39)
- 收藏
- 关注
原创 面试笔记:数据加密和心跳机制
心跳机制就是客户端和服务器之间定期发送一个很小的数据包,用来证明“我还活着,连接还正常”。可以理解为:客户端每隔几秒告诉服务器一次:“我还在线。服务器收到后,就更新这个连接的最后活跃时间。如果服务器在一段时间内没有收到任何消息,就认为客户端可能掉线了。检测连接是否仍然可用;防止 NAT、代理、网关等中间设备回收空闲连接;及时发现掉线用户,更新在线状态;清理无效连接,释放服务端资源。
2026-10-30 10:30:00
331
原创 从 WebSocket到SQLite :一篇讲透实时通信的面试笔记
很多面试问题单独看并不复杂:什么是 WebSocket?SQLite 能不能替代 MySQL?心跳有什么用?但如果只背定义,很容易被追问到“为什么”和“线上怎么排查”。这篇文章把这几个问题放回真实的工程场景中,重点讲清楚它们解决什么问题、各自的边界在哪里,以及常见的实现与排查思路。
2026-10-28 19:28:23
203
原创 从自然语言到 BIM 模型:AI 宿舍楼生成系统实践
完整演示时,先启动 BIMBase 并打开专用的空白 P3D 工程,配置好 BIMBASE_PYTHON 所指向的内嵌解释器,再运行 main.py。rotation 保存的是角度,需要先转换成弧度,再传入旋转函数。生成一栋现代简约风格的六层宿舍楼,采用内廊式布局,标准层每层 24 间四人间,房间开间 3.85 米、进深 7.2 米,走廊宽 2.2 米。例如,同一种床可以通过不同的位置和角度,布置到房间的两侧。出现问题时,也可以沿着这条链路逐步检查:先看需求参数,再看构件清单,最后检查几何创建和坐标变换。
2026-09-12 14:41:59
271
原创 CSES图论总结
遇到课程依赖、任务顺序等问题,考虑拓扑排序。遇到非负权单源最短路,考虑 Dijkstra。遇到一条边可以打折或进行特殊处理,考虑前后缀最短路或分层状态图。遇到负权以及能够无限改善答案的环,考虑 Bellman-Ford。遇到最短距离之外的方案数、最少边数等信息,考虑在最短路径图上进行动态规划。做题时不要先背代码,而要先回答三个问题:第一,图是有向还是无向,边权能否为负?第二,题目求的是最短路、最长路、合法顺序,还是环的影响?第三,是否存在优惠次数、方案数量等额外状态?
2026-07-23 15:25:28
217
原创 CSES Monsters 题解:多源 BFS
地图中可能存在多个怪物。M.....M..........A...对于任意一个格子,我们关心的是:所有怪物中,最早到达这个格子的怪物需要多少时间。如果分别从每个怪物执行一次 BFS,时间复杂度会非常高。正确做法是:一开始把所有怪物都加入同一个队列,然后执行一次 BFS。所有怪物都作为距离为0的起点。之后执行普通 BFS,就能得到所有格子距离最近怪物的最短距离。这道题的关键不是单纯寻找一条从A到边界的路径,而是寻找一条在时间上也安全的路径。1. 将所有怪物加入队列,执行多源 BFS;
2026-07-19 17:18:54
391
原创 Qt 客户端/服务端项目优化
这次优化最大的感受是:项目从“能跑”到“更稳、更安全”,靠的不是某一个巨大改动,而是一组细节共同补齐。心跳机制解决了长连接假在线问题;断线重置让用户体验更明确;密码哈希避免了明文落库;SQL 参数绑定降低了注入风险;粘包处理让 TCP 通信更可靠;敏感日志脱敏减少了调试阶段的信息泄露。后续如果继续优化,我会考虑把传输层也升级为 TLS。因为目前密码虽然不会明文存储,但客户端到服务端之间的传输安全仍然可以继续加强。
2026-07-10 15:46:57
365
原创 操作系统核心知识
操作系统本质上是:管理计算机硬件资源并为用户提供服务的软件。主要功能:进程管理内存管理文件管理设备管理常见操作系统:WindowsLinuxmacOSAndroidiOS进程是:程序的一次执行过程。例如:打开微信:微信程序(静态)→ 程序运行中的微信 → 进程进程拥有:独立地址空间独立资源线程是:CPU调度的最小单位。一个进程中可以有多个线程。例如:浏览器:UI线程网络线程JS线程都属于同一个浏览器进程。多个进程互相等待资源。谁都无法继续执行。
2026-06-21 19:17:04
299
原创 背包问题详解
会给定n个物品,每个物品有两个属性,一个是物品的重量w,另一个是物品的价值v,给定一个背包容量,问,在不超过背包最大容量的前提下,能带走多少价值的物品。这个时候,如果按之前贪心的思路,我们是先选一,再选二,三装不下了,这样得到的价值是160,但是显然最优解是选二和三,有220的价值。原来v,w,k表示的是,价值为v的物品,重量为w,数量有k个,我们直接看成k个价值和重量相同的物品,做01背包问题。比如一个物品有31个,我们可以把这个物品分成1,2,4,8,16,然后把每一组看成独立的物品。
2026-05-29 20:53:15
285
原创 2025届CCPC江苏省省赛题解
在处理PD的问题时,需要用到贪心策略,即优先选择罚时最小的题目,这样就能用最小的罚时超过我们队。对cost数组进行排序,然后遍历cost数组,每次选择一道题,将罚时累加进ftime中,通过题目数累加进solvecnt中,当通过题目数大于a或者通过题目数等于a并且罚时小于b时,输出当前i即可。本质也就是十进制拆位,对于10的x次方,需要花费2的x次方的时间。由于题目说不能重复,所以我们要记录当前字母上一次出现的位置,减去前面出现时已经计算过的子序列数量,才是当前字母出现时提供的新的子序列数量。
2026-05-18 19:55:30
386
原创 2025届CCPC福建省省赛题解
通过观察二进制位我们可以发现,二进制下的偶数位对应的数都是完全平方数,我们的做法就是在疯狂累加二进制(每次加最低比特位达到进位目的),使这个数二进制下只有偶数位上是1,其他位都是0,就得到了一个完全平方数。四种情况中只有③和④是可以保留1的,也就是达到三个数并且三个数中前两个数是0的时候,会进行一次将三个数替换为0的操作。最后我们只需要判断数组中剩余的数是0多还是1多,如果是1多,说明数组剩余元素中比mid大的数超过一半,那么中位数就是一定是比mid大的数,也就是这个mid作为一个答案是合法的。
2026-05-13 21:00:43
511
原创 第17届蓝桥杯备战历程
OK啊朋友们,也是很久没有更新博客了啊。这一个月专注于备战蓝桥杯省赛,最终也是拿下了C++组省一的一个成绩啊,虽然大家都说蓝桥杯水分大,但是我认为这也是一次不错的竞赛经验。今天和大家分享一下这一个月遇到的一些个人认为值得了解的一些算法思路。
2026-05-07 22:06:13
392
原创 动态规划详解
核心:将大问题分解为重叠子问题,通过状态转移避免重复计算,用空间换时间。三要素状态:定义 dp[i] 或 dp[i][j] 表示什么?转移方程:当前状态如何由之前状态推导?初始化:最小子问题的答案(边界条件)。
2026-04-20 16:39:38
568
原创 最短路算法
最短路是存在于带权图上的概念最短路算法分为两种:①单源最短路:指定一个起点x,求这个点s到其他是有点的最短路②全源最短路:可以求出任意两个点之间的最短路。
2026-04-10 09:45:00
1361
原创 DFS实现回溯算法
深度优先搜索(Depth-First Search)是一种用于遍历或搜索树或图的算法。从一个节点出发,沿着一条路径走到底,如果无法继续前进,就回退到上一个节点,尝试另一条路径。你可以把它想象成走迷宫:遇到岔路就先选一条,一条路走到底,走不通了再退回来换另一条。回溯的意思是,我们在搜索的过程中,有可能会做出很多决策在做决策的时候,有一些情况,是不会对全局有影响的而有些题目的决策是会影响到全局的情况的回溯算法本质上是一种试错的思想。
2026-04-06 16:59:45
1014
原创 BFS高频题全解:路径搜索一网打尽
BFS解决路径搜索问题的核心要点:✅ 确定状态表示(坐标、单词等)✅ 明确状态转移方式(邻居如何生成)✅ 正确标记已访问状态✅ 根据需求选择单源或多源BFS掌握了这些,面对路径搜索类题目,你就能迅速找到突破口,写出高效的BFS解法。最后分享一个小技巧:看到"最短"、"最少"、"最近"这类词,优先考虑BFS;看到"所有路径"则考虑DFS或回溯。方向对了,解题就成功了一半!
2026-03-18 20:23:32
424
原创 深度优先搜索和广度优先搜索
在日常生活中,我们经常会对路径进行搜索,为了找到某个要求下的最优路径。同样的,在计算机中也有这样的搜索方法,他们就是深度优先搜索(DFS)和广度优先搜索(BFS)那么问题来了,我们应该如何把所有路径都告诉计算机,让计算机进行选择呢。这里引入一个图的概念,类似于我们平时使用的地图,计算机中也有相应的图论。我们可以使用图来存储所有路线,再通过特定的方法去处理这些路径,从而达到我们搜索的目的。
2026-03-14 11:00:54
427
原创 KMP算法详解
KMP算法用于实现字符串匹配问题。例如查找某个字符串是否是s的子串。普通方法是从s字符串的开头开始一次比较。时间复杂度O(n*m)。KMP该是该方法的优化方法。KMP算法的核心思想,就是每次如果字符串没有匹配成功,不是从头开始重新查找,而是从一个特定的合理位置开始继续查找,减少了查找次数那我们应该如何去找到这个特定的合理位置呢,这就是KMP算法的关键,引入一个前缀表的概念。
2026-01-17 14:39:25
964
原创 前缀和算法详解
然后查找哈希表中是否存在num = sum-targetSum,因为sum-num = targetNum,如果存在,就说明该路径下有一个子路径和为targetNum。再用一个变量count,依次累加arr[i],每次累加完,A公司分得的土地是count,B公司是sum-count,计算土地之差,找到最小值。可以使用前缀和加哈希表的思路,每遍历到一个节点,就将该节点的值加到sum中。我们使用一个新的数组p,用p[i]去记录原数组中0~i的值之和。在求区间时,要注意求解区间,如果区间是2~5,那么使用的是。
2026-01-04 17:01:32
1243
原创 leetcode160:相交链表
这题我们从最开始的两次遍历,到使用额外空间的一次遍历,再到不使用额外空间的一次遍历,多次优化代码,说明一道题不只有一种解法,可以进行不断的优化,找到最优解。,一次得到长度,一次寻找节点,我们可以使用哈希表来存储遍历过的节点,如果当前节点已经在哈希表中存在,就直接返回。④若相交,两个指针一定会在相交节点相遇,若不相交,两个指针一定会同时指向最后的NULL节点。③当其中一个指针指向当前链表结尾时,将其移动到另一个链表的头节点,继续遍历。①先分别计算两个链表的长度,将curA指向长的链表,curB指向短的链表。
2025-12-31 09:09:36
675
原创 C++实现简单LRU缓存算法
LRU缓存是一种常见的缓存淘汰算法,用于在缓存空间不足时,决定哪些数据应该被移除。当缓存已满时,优先淘汰最近最少使用的数据。LRU缓存是一种基于时间局部性原理的经典缓存管理策略,通过“淘汰最久未用数据”来最大化缓存效用。虽然在高并发或特殊访问模式下可能不是最优选择,但其简单有效的特性使其成为应用最广泛的缓存算法之一。
2025-12-25 15:12:45
945
原创 递归算法和回溯算法
回溯算法是一种通过试错来寻找问题解决方案的算法。它采用深度优先搜索的策略,在搜索过程中逐步构建解决方案,当发现当前路径不可能得到正确解时,会回溯(退回)到上一步,尝试其他可能性。而由于其退回到上一步的特点,非常适合使用递归来实现递归是基础:回溯算法通常用递归实现,递归提供了回溯所需的"返回上一层"的能力回溯是应用:回溯是递归的一种特定应用场景,专注于"试错-返回"的搜索策略。
2025-12-21 17:18:36
1306
原创 二叉树深度探索:遍历、性质与经典算法
每一种遍历方式都有其特点,根据不同的题型选择合适的遍历方式往往可以达到更好的效果遍历方式访问顺序关键特点应用数据结构前序遍历根 -> 左 -> 右先访问根。第一个节点是整棵树的根。复制二叉树、反转子树栈(递归/迭代)中序遍历左 -> 根 -> 右在中间访问根。对BST会得到有序序列。二叉搜索树的中序遍历得到升序序列栈(递归/迭代)后序遍历左 -> 右 -> 根最后访问根。最后一个节点是整棵树的根。释放二叉树、计算节点数/高度栈(递归/迭代)层序遍历。
2025-12-13 17:34:04
1161
原创 算法详解:滑动窗口机制
高效:将O(n²)优化到O(n)直观:符合人类的思维习惯通用:有固定的模板可以套用灵活:适用于各种变种问题希望这篇指南能帮助你掌握这个强大的算法技巧!加油!!!
2025-11-29 19:58:55
1425
原创 详解六大排序算法
我们在处理数据时,常常会遇到关于数据排序的问题,那么我们应该用什么方法去完成排序呢,这些方法的运行时间,占用空间以及对数据相对位置的影响又有什么区别呢在C++中,对数据进行排序时,我们关心的是完成排序的时间空间复杂度.以及算法的稳定性,即排序完成后相同元素的相对位置是否发生改变.为了完成排序这一过程,我们有六种排序方法:分别是计数排序(桶排序),选择排序,冒泡排序,插入排序,快速排序(快排),归并排序.
2025-11-26 10:03:43
1075
原创 C++理解队列:从概念到实现
首先让我们了解一下队列的概念C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。队列这种先进先出的结构类似一个管道,从管道的一头放入数据,从管道的另一头取数据。其中放数据的一端叫做尾,取数据的一端叫做头。
2025-11-16 15:30:21
814
原创 哈希冲突的原因及解决方法
哈希表由哈希函数实现哈希函数(1)、哈希函数认为输入无穷大,输出相对有限的容器。其中一些经典的哈希函数有MD5、SHa1等。其中MD5的返回值是128位的数,SHa1的返回值是160位的数。(2)、相同的输入对应相同的输出,不存在随机成分(3)、由于输入无穷大因此可能存在不同的输入对应相同的输出,这被称为哈希碰撞(哈希冲突),这种情况出现的概率极小,只有在极大样本输入时才可能产生一次碰撞。均匀性:类似的输入通过打乱然后得到均匀。极为相似的输入得到的输出是满足离散性和均匀性的。
2025-11-01 17:11:14
969
原创 哈希表的原理及哈希结构的使用
什么是哈希表?哈希表(英文名字为Hash table,国内也有一些算法书籍翻译为散列表)是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将键映射到数组的特定位置,支持 O(1) 时间复杂度的随机访问。最简单的哈希表是数组。哈希表使用哈希表通常用于查找某个元素是否在某个集合中出现过。常见的三种哈希结构当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。接下来我们通过一道整数去重的练习,来了解这三种哈希结构是怎么使用的。
2025-11-01 16:45:21
956
原创 C++:二分查找
二分查找,顾名思义就是将数组分为两个部分,然后进行判断需要查找的元素位于前半部分还是后半部分,再去相对应的部分继续进行分成两个部分的操作,直至找到目标元素.:二分查找一般用于有序数组,如果是无序数组可以先用sort函数或者冒泡排序将其变为有序数组后再用二分查找:一个正序数组为[1,2,3,4,5,6,7,8,9],现在我们需要查找元素3的位置。
2025-10-26 12:25:21
1203
原创 练习:如何处理字符串中的特殊字符
昨天我们学习了对于字符串中的特殊字符的处理方法,包括去除字符串中的空格,去除字符串中的符号,对多个连续空格的处理(可以去看看昨天的文章),今天我们针对每种类型的题目,给出相应的解决方法,在实战中巩固知识输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。注意:如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
2025-10-02 09:30:00
1039
原创 如何处理输入字符串中的特殊字符
通过while()循环遍历,若字符串中的元素是空格则直接将i++,如果不是空格,可以用一个start变量先接收i,再嵌套一个while循环,当s[i]又是空格时结束,每次循环将i++,内部循环结束用end变量接收i,此时start和end变量即是单词的开头和结尾,可以进行一系列操作(如反转)如果用平时的思想,先写一个单词,再加一个空格,那最后一个单词后就会多一个空格,并且判断条件不好写.所以我们可以改变思维,在除了第一个单词的所有单词前加一个空格.由于最后一个字符串后没有逗号,需要手动将其输入数组中。
2025-10-01 09:30:00
1066
原创 练习:密码翻译,加密的病历单,整理药名
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。加密:①左移三位②反转字符串③反转大小写。
2025-09-30 09:30:00
1183
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
2