自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(106)
  • 收藏
  • 关注

原创 测试--测试分类 (白盒 黑盒 单元 集成)

可以设计更有针对性的用例,如模拟接口调用、Mock 数据。不需要深入所有源代码,但会参考接口文档、中间模块结构。✅ 不考虑程序内部实现,重点在于输入与输出是否。较全面,适用于复杂系统间数据流/状态流的验证。无法覆盖具体逻辑路径,可能遗漏内部缺陷。能提高代码质量,及时发现隐藏逻辑问题。进行测试,关注“怎么实现的”。(冒烟测活着没,回归测改坏没)能从用户角度检验功能是否正常。不需要读代码,只需理解需求。关注每条路径是否被测试到。✅ 结合黑盒和白盒测试,:验证核心功能是否正常;:确保修改不引入新Bug。

2025-05-18 16:10:09 443

原创 C++ 手撕shared_ptr

避免用户无意中传入原始指针而生成 shared_ptr。

2025-05-17 16:10:26 647

原创 测试--测试用例(设计测试⽤例的⽅法 http格式)

编号方法名核心思想最适合的场景记忆口诀1等价类划分有效 + 无效数据代表全体表单输入、接口参数验证(输入值可分类的场景)一类选一个,代表全体2边界值分析边界最容易出错年龄/金额/数量/长度/时间等上下限敏感的输入字段边界有坑,必测上下3正交法参数组合最小化测试多配置、多参数组合(如浏览器×操作系统×网络等)组合太多,用表挑对4判定表法条件+动作=逻辑关系矩阵复杂业务规则判断(如发券、权限、价格计算、审批)逻辑复杂,全表搞定5场景法按用户行为路径设计步骤链。

2025-05-16 16:44:48 961

原创 测试--BUG(软件测试⽣命周期 bug的⽣命周期 与开发产⽣争执怎么办)

1. 当且仅当规格说明是存在的并且正确,

2025-05-15 16:20:29 841

原创 测试--开发模型 测试模型

Scrum 是敏捷开发(Agile)的核心实践之一,是一种迭代式增量软件开发模型,强调小步快跑、快速反馈、持续改进。Scrum 的三大核心角色角色职责Product Owner(产品负责人)管理产品需求,撰写并维护用户故事(User Story);进行价值排序,制定产品发布计划。Scrum Master(敏捷教练/项目协调员)组织会议,消除障碍,保障 Scrum 流程有效执行,为团队服务。开发团队(Team)跨职能团队,通常由 5~9 人组成,负责具体的开发、测试、设计等任务,完成每个迭代目标。

2025-05-14 15:55:14 653

原创 一.Gitee基本操作

git diff 是 Git 中用于查看代码变更内容的命令,帮你对比不同版本、文件或状态的具体修改细节(逐行对比)。因为已经commit提交到版本库了,log已经记录当前版本ID HEAD指向当前版本,撤销就是要回到上一个版本。带上 --hard就是连带工作区的代码也进行修改 但不能但只对一个文件进行操作,会把所有文件进行修改。git reset +要回退到的版本的提交ID (默认选项--mixed 版本库+暂存库都会回退)git reset 回退版本(会更改提交历史) 用于本地撤回提交、修改。

2025-05-12 21:49:17 976 1

原创 C++ 基于多设计模式下的同步&异步⽇志系统-2项目实现

模块功能Logger类日志器,统一管理日志级别、格式化器、输出目的地Formatter类日志消息格式化(支持自定义格式)Sink类日志落地(支持stdout/file等多种输出)Builder模式统一构建日志器(配置LoggerName、LoggerType、Formatter、Sink等)LoggerManager(单例)全局日志器管理中心,负责创建、查找日志器实例异步模块(AsyncLogger)实现缓冲区管理、异步push和write,减少主线程I/O阻塞。

2025-04-27 19:38:22 1146

原创 C++ 基于多设计模式下的同步&异步⽇志系统-1准备工作

2.C⻛格不定参函数3.C++⻛格不定参函数四.设计模式1.六大设计原则应用: 只负责组织和发起日志输出。 专注于格式化日志内容。 专注于日志“落地”(文件/控制台等输出方式)。 专注于日志数据结构封装。🔓 2. 开闭原则(OCP)应用:增加新的日志输出格式、日志落地方式(如新增 TCP 日志输出)→ 新增类即可,无需改动原逻辑。格式化模块通过解析 等 pattern 字符串,支持灵活扩展。🔁 3. 里氏替换原则(LSP)应用:所有日志输出

2025-04-19 20:12:59 1081 1

原创 C++ Json-Rpc框架-4项目回顾总结

输出标准日志,标明日志级别 + 时间戳 + 文件名 + 行号为了让框架具备高可扩展性、低耦合性和良好的抽象能力抽象了连接行为BaseBuffer抽象了缓冲区读取行为抽象了协议消息对象①统一连接行为接口 解耦底层实现,提高可替换性我们的网络层底层使用了 Muduo,但我们不希望业务逻辑与具体网络库绑定。所以用抽象连接操作,上层只关注 send()/shutdown() 等接口,而不关心底层是 TCP 还是 WebSocket、是 Muduo 还是 Boost.Asio。

2025-04-18 11:36:10 780

原创 C++ Json-Rpc框架-3项目实现(2)

我们用哈希表来管理客户端连接池时:我们知道在哈希表中是通过key值找到对应的val值的,但并不是直接用我们传过去的数当key,需要进行哈希值计算。(1.int size_t bool直接强转 2.char* string// 类似 BKDR hash)而库中实现了string、int、float 等基本类型的哈希值计算,但这个Address pair<string,int>是个自定义类型,需要我们自己重载哈希值计算。

2025-04-14 11:09:01 1066

原创 C++ Json-Rpc框架-3项目实现(1)(1.其它函数实现2.消息类型字段定义3.消息Message/通信Muduo抽象具象实现)

2.Json序列化和反序列化工具序列化反序列化二.项⽬消息类型字段信息定义三.消息/通信抽象实现2.缓冲区抽象类协议抽象类连接抽象类服务端抽象类6.客户端抽象类四.消息/通信具象层实现1.BaseMessage消息具体实现JsonRequest基类Response类型实现JsonResponse基类:消息对象的生产工厂

2025-03-24 16:34:21 737

原创 C++ Json-Rpc框架-2框架(服务端模块 客户端模块 框架设计)

本质上来讲,我们要实现的rpc(远端调⽤)思想上并不复杂,甚⾄可以说是简单,其实就是客⼾端想要完成某个任务的处理,但是这个处理的过程并不⾃⼰来完成,⽽是,将请求发送到服务器上,让服务器来帮其完成处理过程,并返回结果,客⼾端拿到结果后返回。然⽽上图的模型中,是⼀种多对⼀或⼀对⼀的关系,,且其服务端的负载也会较⾼,因此在rpc实现中,我们不仅要实现其基本功能,还要再进⼀步,分布式架构:简单理解就是由,这些节点通常指的是服务器,,通过协同⼯作解决⾼并发的问题,提⾼系统扩展性和可⽤性。

2025-03-21 15:52:37 1094

原创 C++ Json-Rpc框架-1准备工作(JsonCpp Muduo 异步操作)

Json 是⼀种数据交换格式,它采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。如: 我们想表⽰⼀个同学的学⽣信息• C 代码表⽰• Json 表⽰"姓名" : "xx","年龄" : 18,"成绩" : [88.5, 99, 58],"爱好" :{"书籍" : "西游记","运动" : "打篮球"Json 的数据类型包括对象,数组,字符串,数字等。• 对象:使⽤花括号 {} 括起来的表⽰⼀个对象• 数组:使⽤中括号 [] 括起来的表⽰⼀个数组。

2025-03-20 17:44:34 999

原创 多路转接 select/poll epoll

poll 解决了 select 的 FD 数量限制问题,但仍然存在 O(N) 遍历的问题。 epoll 通过事件驱动机制,避免遍历所有 FD,提高了 epoll_wait() 的效率,适用于高并发。epoll 采用 ET 模式,可以减少 epoll_wait() 调用次数,提高吞吐量,但需要开发者正确处理 recv() / send()。

2025-03-18 15:57:53 688

原创 TCP 全连接队列 内核层理解socket

参数表示。那什么是全连接队列呢?accept()accept()accept()也就是说我们访问服务器会由内核自动进行3次握手,,服务端再。而listen的,如果服务器来不及调用accept()处理连接,连接会堆积在超过最大连接长度,再进行连接就会三次握手失败。所以全连接队列本质就是一种backlog不能太长也不能太短。1.太短,可能丢失大量连接(客户端需要重试,增加网络负担)。2.太长,一方面会让用户,另一方面会。

2025-03-14 12:30:00 1174 1

原创 五种 IO 模型 (异步IO同步IO)

任何 IO 过程中, 都包含两个步骤. 第一是等待, 第二是拷贝.IO=等待+拷贝而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让 IO 更高效, 最核心的办法就是让等待的时间尽量少.即单位时间内,IO等待时间的比重越低效率越高。I/O 模型等待方式等待时间长短CPU 利用率适用场景阻塞 I/O(Blocking I/O)等待recv()返回长(进程完全被阻塞)低(进程无法做其他任务)小规模应用非阻塞 I/O(Non-blocking I/O)recv()轮询数据中。

2025-03-12 17:22:29 680

原创 NAT NAPT

通过这种方式,正向代理可以实现多种功能,如提高访问速度、隐藏客户端身份、实施访问控制等。工作原理客户端将请求发送给正向代理服务器。正向代理服务器接收请求,并根据配置进行处理,如缓存查找、内容过滤等。正向代理服务器将处理后的请求转发给目标服务器。目标服务器处理请求,并将响应返回给正向代理服务器。正向代理服务器将响应返回给客户端。功能特点。

2025-03-10 18:11:43 786

原创 数据链路层 (以太帧 MAC地址 ARP协议)

"以太网" 不是一种具体的网络, 而是一种技术标准;既包含了数据链路层的内容, 也包含了一些物理层的内容.以太网是当前应用最广泛的局域网技术;和以太网并列的还有令牌环网, 无线LAN 等;

2025-03-10 13:30:00 2059

原创 网络层 IP协议

通过IP协议能把数据送到目标主机,

2025-03-09 13:30:00 957

原创 UDP协议 TCP协议(格式 超时重传 滑动窗口 拥塞控制...)

是。

2025-03-07 13:05:05 1264 1

原创 Linux网络_应用层自定义协议与序列化_守护进程

比如说我们传一个结构体data,里面包含 int x,char oper ,int y。我们不要一个一个传,可以把成员元素整合成一个字符串,再传。这个就是序列化但当我们获取到了这个字符串,怎么获取到里面包含的消息呢?我们可以自己进行规定,每个元素间用空格进行隔开,依次进行获取。根据制定的规则进行解包,获取元素,就是反序列化。序列化: 你将结构体的各个成员转换成某种格式的字符串,以便传输或存储。例如,使用空格分隔成员。反序列化: 接收端根据预定的规则解析字符串,并将其恢复为原始数据结构。

2025-03-03 19:42:16 625

原创 Linux网络_套接字_UDP网络_TCP网络

AF_INET网络 AF_UNIX本地AF_INETAF_INET6AF_UNIXAF_LOCALAF_PACKETAF_NETLINKSOCK_DGRAMSOCK_RAW0返回值-1errno错误代码。

2025-01-15 15:35:40 1155 1

原创 排序算法的实现(插入,希尔,选择,冒泡,堆排,快排)

对n个元素进行选择排序,我们可以遍历一轮找出最大值放在末尾,直到循环n-1次。为了提高效率,我们可以同时找出最大值和最小值,分别放在末尾和开头。

2025-01-07 18:24:04 776 2

原创 滑动窗口_⻓度最⼩的⼦数组&&⽆重复字符的最⻓⼦串&&将x减到0的最⼩操作数

思路一:两个指针,p1p2同时指向第一个元素。sum+=p2,如果sum

2025-01-07 17:55:01 357

原创 链表_逆序链表_合并链表

2.重复n次,逆序k长度的链表1.cur指向原链表中需要插入到新链表的结点2.prev进行头插时要用到的节点3.tmp记录下一次要插入位置的使用的结点(cur进入循环前的位置)(新链表的尾结点)从每条链表中取第一个元素(链表最小值),再从这些节点中选出一个最小的插入到新链表中。把s->next=nullptr断开链表后,新建head2新的空头节点,遍历右侧链表进行头插,完成逆序。我们可以再新建一个链表,进行尾插,第一次取左侧链表的结点,第二次取右侧链表节点,直到两个链表节点都取完。

2025-01-07 17:15:21 979

原创 floodfill算法_dfs

对靠近Pac洋的格子dfs进行标记,还要对靠近Atl洋的格子dfs进行标记。边界情况:如果初始位置值结束目标值,那在dfs过程中不会改值,就会出现走重复路径的情况。每遍历到一个1且没有标记过,就从该位置进行dfs,进入dfs就标记并记录当前面积,dfs结束获取这一块1的面积。1.看临边是Pac洋的格子从低到高走,四周的格子比它大就可以走。2.看临边是Atl洋的格子从低到高走,四周的格子比它大就可以走。(用红色标记走过的格子)每个格子上都有水,水从高处流向低处,问那个格子的水可以流向太平洋和大西洋。

2025-01-06 16:33:36 412

原创 综合练习dfs_2(N皇后 解数独 单词搜索)

一共有9个格子,我们不要考虑一个格子一个格子进行考虑,第一个Q放在第一行的第一个格子,第二个Q放在第一行的第二个格子。row[9][10] 判断行 [9]9行 [10]该行内是否存在对应数 eg.row[0][1]=true 该行第一个行中有1。gird[3][3][10] 把9个格子分成三份 下标0 1 2 /3都对应0,[10]用来统计每个大格子中是否存在对应的数。,n=3就可以分为3中情况,再分别以这3种情况再进行划分,第二行中Q可以放在哪里。,n=3有几条正对角线,可看出5条(n*2-1)。

2025-01-05 16:32:11 959

原创 综合练习dfs_1

递归返回的路径字符数肯定是n*2的,我们直接递归枚举出所有的情况,再进行剪枝剪去不能组成括号的情况:1.左括号数不能大于n 2.在递归过程中右括号的数不能大于左括号的数。因为不能出现重复的eg.[1,2] [2,1],所以在递归时要进行剪枝 eg.2_ _ _选数时不能选自身 也不能选前面的数,只能选后面的数。eg.[1,1,1,2] 看似可以选4个数,但为了不重复第一个数只能选1_ _ _ 2_ _ _。当我们选了第一个1,第二个1第三个1就不能选了,因为以第2 3个1开头的数和第一个1都是值一样的。

2025-01-04 16:23:58 909

原创 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列_子集(重点)

递归解决:一开始选一个数,递归进入下一层再选一个新的数,直到到最后一个数。定义一个全局的path数组记录一条路径的数,再定义一个全局的二维数组re记录每条路径。方法二就是根据选数的个数来找,选0个数的组合 1个数的组合 2个数的组合...当我们选完一个数后,选下一个数时,只能选该数在nums数组后面的数。传参数pos标记该数在nums数组中的位置,for循环遍历它后面的数。每一次进入dfs函数时,当前的path都是一次结果,存入直接返回。这样我们就画出了一个二叉树,遍历该二叉树,叶子节点就是结果。

2024-12-29 15:17:39 634

原创 二叉树的深搜_求根节点到叶节点数字之和_验证二叉搜索树_二叉树的所有路径

深度遍历二叉树时,用一个path字符串来记录经过的结点:不是叶子节点加val->,叶子节点加val,并返回。我们定义一个全局的变量prve记录上一个遍历数的大小,进行中序遍历,如果prve不是单调变化的,就说明它不是二叉搜索树。像上述左右子树+当前节点val==0,3个节点val都为0,根据上面的判断从叶子节点开始删也可以一个一个删除。每遍历一个节点就累加当前节点的val,如果为叶子节点就直接返回,有孩子继续递归累加数字。在遍历的过程中,维护一个当前路径列表,用来存储从根节点到当前节点的路径。

2024-12-28 20:11:36 570

原创 递归_汉诺塔_链表_快速求幂

逆序整个链表就可以分为逆转诺干个两个节点 可以用递归 dfs完成后面第一个节点后面所有节点的逆转,再把第一个 第二个节点逆转 并让第一个节点指向空就可以了。但-2^31 <= n <= 2^31-1 如果n==-2^31 它变为正数int会存存不下,所以n要用long long。如果n是偶数x^n=x^(n/2)*x^(n/2) 是奇数x^n=x^(n/2)*x^(n/2)*x。我们只需要处理好前两个节点的交换 剩下节点交换交给dfs并返回交换完成的头节点。一直找两链表头节点较小的节点 就可以用递归。

2024-12-27 17:37:50 308

原创 BFS 解决拓扑排序_ 课程表_火星词典

拓扑排序的基本要求有向无环图(DAG):拓扑排序只适用于没有环的有向图。如果图中有环,无法进行拓扑排序。唯一性:对于一个DAG,拓扑排序不一定是唯一的,可能有多种有效的拓扑排序结果。把操作看成结点,每个结点都有入度和出度,但每次都只能去入度=0的结点(没有指向它的),把该节点取下来 再看它指向的节点是否入度为0 为0就取下来。一直重复直到没有节点,或者没有入度为0的节点。排序的情况可能不止有一种 只要入度为0就可以取下来。

2024-12-25 21:27:14 777

原创 多源 BFS最短路问题_矩阵

我们要根据isWater数组推出最大的高度的数组,一开始我们只知道下标val值==1的海洋的高度是0,根据这个就可以推出海洋周围陆地的高度,因为高度差最大1且求最大高度的数组,海洋周围的陆地最大为1,再根据1再推2...先对四周进行bfs把为1的陆地标记或者直接设置为0,最后再遍历一次二维数组,把没有标记的1累计,返回累计的陆地面积。这道题和之前做的被淹没的陆地一样,只不过上到题是算还剩几块陆地,这个算剩余陆地的面积。之前我们都是做的一个点到另一个点的最短路径问题,现在有多个点,找它们到最短路的距离。

2024-12-18 16:30:00 347

原创 BFS 解决最短路问题_最短迷宫_基因变化_为高尔夫比赛砍树

用一个队列q存储当前层要遍历的节点,当前层节点全遍历完同时入队下一层要遍历的节点,并记录当前层数。遍历的时候用二维数组map记录遍历的位置,防止不必要的遍历。如下图砍的第一颗树必须是所有val值中最小的,也就是2,我们要求出来[0,0]起始下标到vla=2的下标的最短距离。vector<pair<int,int>>tree sort(tree.begin(),tree.end(),[](){里面实现根据val完成降序};和上一题基本一样,只是两层for循环不同,还有算的是单词的个数,不是变化的次数。

2024-12-17 13:30:00 572

原创 BFS 解决 FloodFill 算法_图像渲染_岛屿数量_被围绕的区域

bfs,广度优先遍历,先以一个点,向四周扩散,再以新扩散的点向四周扩散,直到没有目标点。起始点可以看作根节点,它四周的目标节点就相当于它的孩子,pop根节点 push它的孩子,遍历进入下一层,以此类推,直到队列为空。1.numIslands 函数通过遍历整个网格,每次遇到未访问的陆地 '1',就开始 BFS 搜索并将与之连接的所有陆地标记为已访问。完成后,靠近边界的O块及其连接的O块对应的map都为1。3.map 数组用于记录哪些点已经被访问过,避免重复访问。靠近边界的O块及其连接的O块,不能改。

2024-12-16 12:30:00 220

原创 优先级队列_ 前K个高频单词_数据流的中位数

如果定义成左边多,left==right left+1==right都可以看做平衡,反之left==right+1就不平衡了。3.比较器(比如 std::greater<int>小堆 或 std::less<int>大堆)。1.num<=left.top() || left.empty() 小于左边的最大值 或者 左边没有值 去左边。如果是偶数,左右两部均分。如果是奇数,肯定有一边多1,可以自己定义左边多,也可以定义成右边多。小根堆:堆顶是当前 k 个最大元素中的最小值,所以第 k 大的元素就是堆顶元素。

2024-12-15 12:30:00 958

原创 队列+宽搜_429. N 叉树的层序遍历_二叉树最大宽度

定义一个队列q,将一层的节点入队,并记录节点个数。根据节点的个数,出队列,并将其孩子入队列。出完队列,队列当前剩余节点的个数就是下次出队列的次数。2.知道队列头节点的下标 尾节点的下标 : i尾 - i头 +1 尾两节点的距离就是当前层最长的距离。1.存入队列中的元素类型为pair<TreeNode*,int>,也要把对应节点的下标传过去。入完后再把存有孩子节点的数组t复制到原数组q上,减少数组出队列移动元素的时间。3.算完当前层,再把它们左右孩子入队列,直到队列为空.出队父母节点,入队其孩子节点。

2024-12-14 19:45:18 206

原创 栈_删除字符串中的所有相邻重复项_基本计算器 II_字符串解码

借助栈结构,遍历字符串 放入一个字符前看看是否和栈顶元素相同,相同就出栈栈顶元素,如果为空或者不相等就入栈。遍历结束栈中剩余的字符就是目标结果。1.先用栈存储运算后的结果 char sym记录运算符(因为题目说所有数都是整数,所以sym初始化=+)一个表达式中* / 优先运算,我们先把* / 先运算完,最后再把这些数加起来。看当前sym是什么,我们可以用string来模拟栈,返回时就不用再从栈中获取返回结果。方法二:用两个栈,一个栈记录字符串 一个记录数字。+直接入栈 -取反入栈 *乘栈顶 /除栈顶。

2024-12-13 12:00:00 259

原创 字符串_最长公共前缀_最长回文子串_字符串相乘

tmp代表每一次运算出的结果 "837" "0516" "00294" 把它们加到ret,再reverse翻转,最后把末尾的0除去。奇数aba 取中间点i,left=i right=i left right分别向两边走,如果不相等就不是,直到全遍历完。倒着遍历a b,存在且为1 t++位数和 re+=t%2+'0'除去进位的余数 t/=2进位。1.定义一个数组 tmp[n+m] ,下标0存个位和个位无进制相乘的数,下标1存十位和个位,...(如果乘数有一方==0,那么re字符串就全为0)

2024-12-12 12:53:33 384

原创 哈希表_两数之和_字母异位词分组

a+b=target,遍历数组固定a,在数组中找b。eg.固定a=2,在数组中找7。有什么快速的方法能找到对应的数呢?先遍历一般数组,用哈希表记录所有的数及其下标,再遍历一次数组根据哈希表找对应的数的下标。但这会出现一个问题,如果有两个相同的值怎么办?哈希表中只能存唯一的一个Key。我们应该遍历一次数组,当我们遍历到一个数a时,应该在a数前面找b,没有就把a放入到哈希表中。然后继续下一个数,直到在该数前找到对应的b。两个字符串中每个字母出现的次数必须相同。

2024-12-11 17:26:36 282

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除