- 博客(136)
- 收藏
- 关注
原创 在做题中学习(88):N叉树的层序遍历
顺序问题,当1节点首次塞入辅助数组后,就把它的孩子全部塞入队列,下一次要塞入他的孩子进辅助数组,只需循环q.size()次即可。(注意:在塞入孩子到队列中时,队列size就会增加,因此同层节点的循环可能会被破坏,因为同层节点有可能又要塞入孩子,因此,循环时需要保存上一次的q.size()。1.一个节点入队列,先进行保存进辅助数组,并加入它的所有孩子。2.同层节点塞入辅助数组,再插入到ret数组中。如何保证同一层节点都完整塞入辅助数组?
2025-02-25 13:26:45
270
原创 在做题中学习(90):螺旋矩阵II
创建相同大小的一个二维数组(矩阵),用变量标记原矩阵的行数和列数,每次遍历完一行或一列,相应行/列数--,进行对应位置的赋值即可。此题是正方形矩阵,因此不像螺旋矩阵I需要边界判断。
2025-02-19 21:18:44
157
原创 在做题中学习(89):螺旋矩阵
要有边界条件的判断,因为要保证 rows>0 && cols > 0,while循环中的某次for结束将对应rows-- 到0 / cols--到0,后面再继续就会出问题,解决方法就是再加一层if判断即可。创建ret数组,用变量标记原矩阵的行数和列数,遍历一个元素就push_back进ret数组,每次遍历完一行或一列,相应行/列数--,进行顺时针螺旋遍历到为0即可。
2025-02-19 21:17:45
550
原创 在做题中学习(87):最大子数组的和
因为此题是带有负数的,因此i位置为结尾的最大子数组有可能是它本身,因此要取它本身,和前面子数组+i位置元素的最大值。dp[0] = nums[0],之后处理dp数组时不需要特殊判断。以i位置为结尾的子数组。
2025-02-18 08:53:26
247
原创 在做题中学习(86): 验证回文串II
和正常判断回文串一样,定义头尾双指针,当遇到不相等时,需要判断l+1,r位置是否相等,亦可判断l,r+1位置是否相等,这俩方法对应:删除l位置元素,删除r位置元素。而判断的工作交给另一个函数即可,且这俩情况有一个返回true就OK,若俩都为false,则不OK。最后判断完会走到一起,指向的就是那只剩一个的字符,因此外侧return true即可。
2025-02-18 08:53:15
143
原创 在做题中学习(85):验证回文串
之后定义头尾双指针,向内判断,两者为字母数字字符时,才可判断,由第一个例子看出:A man, a plan, a canal: Panama 不判断, : 特殊字符,因此头尾都需要判断 + 跳过,头尾都指向字母数字字符后再进行判断即可。因此,定义一个临时字符串,通过这俩函数的筛选,重新构造合法字符串,然后判断这个字符串是否为回文的即可,这个也可以用函数进行逆序。towoler(char)函数,如果char是大写,就转小写,如果是小写或不是字母,返回本身。双指针 + 暴力判断。
2025-02-17 08:01:02
261
原创 在做题中学习(84):全排列II
再看绿色,观察到,它如果和前一个元素一样,那就得跳过,并且我们要把绿色和红色情况区分开,因为如果只是nums[i-1] == nums[i] 的话,红色后面的1为什么可以用呢?再看绿色,观察到,它如果一个元素和前面元素不相等,那必然是新的需要参与进来的节点,那还要区分红色和绿色的情况,而如果前一个位置的1是标记为true的话,证明前一个元素已经考虑过了,不用再考虑他了,因此开始我这个节点就一定是合法的。最后因为是跳过不合法的节点,而判断充斥着i-1的判断,因此i!通过树,就已经可以判断出。
2025-02-08 09:32:08
465
原创 在做题中学习(83):全排列
现在考虑在首个节点的子树下,一个数字只能使用一次,因此可以用一个bool check[]数组来标记每个首元素的搜索过程中元素的有效性。递归出口:当path.size() == nums.size() 时,说明path数组已经走完一条子树,可以把它加入到ret数组中了。如何构造结果返回,可以定义,ret数组和path数组,首个节点的子树下开始,每次搜索到一个合法的元素,就加入path数组。上面的ret , path , check 数组都可以变为全局的数组,因为局部数组越多,在dfs函数中函数头就会越复杂。
2025-02-07 09:23:26
384
原创 在做题中学习(82):最小覆盖子串
check(hashs[],hasht[])是一件很费时的工作,要判断俩数组的元素种类对应的个数相不相同,需要循环遍历判断;思路:题目要求找到s里包含t所有字符的最小子串,这就需要记录在s中每次查找并扩大范围时所包含进去的字符种类是否和t的相同,并且:题目提示t中会有重复字符,因此。3出窗口之前: if(hashs[s[l]] == hasht[s[l]]) count--;1.进窗口之后:if(hashs[s[r]] == hasht[s[r]]) count++;begin = l;
2025-01-28 22:45:53
475
原创 在做题中学习(81):替换后的重复字符
题目要求返回一个包含相同字母的最长字串,那就在数组中遍历找到,而又因为在暴力枚举时,会出现重复的情况,例如:在枚举以2为下标的子串时,长度结果已经在枚举下标为1的子串中记录了,因此不必做这种重复性的操作,只需定义l r两个指针,维护一个窗口进行同向的滑动即可。: 中的相同字符数量要搞清楚,要的是最多的相同字符个数,因为在窗口右移的过程中,可能后面新加进来的某个相同字符数量超过开始的那个字符的数量,因为上面原因的分析,发现我们要的字串的长度要满足条件取决于。2.l++后,紧跟着会r++
2025-01-27 18:45:41
528
原创 protobuf: 网络版通讯录
序列化协议通⽤性格式可读性序列化⼤⼩序列化性能JSON通⽤(json、xml已成为多种⾏业标准的编写⼯具⽂本格式好轻量(使⽤键值对⽅式,压缩了⼀定的数据空间中XML通用⽂本格式好重量(数据冗余,因为需要成对的闭合标签低ProtoBuf独⽴(Protobuf只是Google公司内部的⼯具)⼆进制格式差(只能反序列化后得到真正可读的数据)轻量(⽐JSON更轻量,传输起来带宽和速度会有优化高。
2025-01-19 19:44:46
685
原创 protobuf: 通讯录3.1
在通讯录3.0版本中,我们向service⽬录下的contacts.proto新增了‘⽣⽇’字段,但对于client相关的代码并没有任何改动。验证后发现新代码序列化的消息(service)也可以被旧代码(client)解析。并且这⾥要说的是,新增的‘⽣⽇’字段在旧程序(client)中其实并没有丢失,⽽是会作为旧程序的未知字段。
2025-01-18 20:42:29
552
原创 protobuf: 通讯录3.0
如果通过删除或注释掉字段来更新消息类型,未来的⽤⼾在添加新字段时,有可能会使⽤以前已经存在,但已经被删除或注释掉的字段编号。将来使⽤该.proto的旧版本时的程序会引发很多问题:数。我们再使⽤这些编号或名称时,protocolbuffer的编译器将会警告这些编号或名称不可⽤。如果现有的消息类型已经不再满⾜我们的需求,例如需要扩展⼀个字段,在不破坏任何现有代码的情。中,但是当消息反序列化时如何表⽰是依赖于编程语⾔的。整型字段总是会保持其的值。若解析出来的数值与相应的类型不匹配,会采⽤与C++⼀致的处理⽅案。
2025-01-17 22:23:00
396
原创 protobuf: 通讯录2.4
write.cc(只展示新增部分);i++)std::cout << "请输入备注"<< i+1 << "的主题(只输入回车则退出): ";break;std::cout << "请输入备注"<< i+1 << "的内容: ";解释:作用是系统返回一个已经被开辟好空间的remark,也就是map类型的指针,我们可以对这块空间进行操作read.cc(只展示新增部分)std::cout << "备注: " << std::endl;
2025-01-16 22:01:02
349
原创 protobuf: 通讯录2.3
作用是返回一个枚举常量,让我们知道哪个 oneof 字段被设置了,下面判断的时候可以用到。,那么就可以使⽤ oneof 加强这个⾏为,也能有节约内存的效果。消息中有很多可选字段,并且将来同时。
2025-01-14 20:11:01
326
原创 protobuf: 通讯录2.2
mutable_data()方法:得到返回值为Any类型的指针,这类⽅法会为我们开辟好空间,可以直接对这块空间的内容进⾏修改。其实也是一个.proto文件中的message类型(protobuf内置的)。UnpackTo() ⽅法可以将 Any 类型转回之前设置的任意消息类型。Is() ⽅法可以⽤来判断存放的消息类型是否为 typename T。PackFrom() ⽅法可以将任意消息类型转为 Any 类型。作用:可以存储任意消息类型,类似于面向对象编程中的多态。write.cc(只展示新增部分)
2025-01-04 22:43:06
407
原创 protobuf: 通讯录2.1
格式: protoc --decode=消息类型.package命名 消息所在文件 < contacts.bin(本来是从标准输入中读,现在加上< 就到contacts.bin中读)与 import 其他的.proto文件中的enum枚举类型中的常量值相同也会报错,除非import 的.proto文件有package包住。hexdump:是Linux下的⼀个⼆进制⽂件查看⼯具,它可以将⼆进制⽂件转换为ASCII、⼋进制、注意:同级的枚举类型,常量名不能相同!注意格式和c/c++不同,定义时后面是 ";
2024-12-31 22:48:35
347
原创 protobuf: 初识
值得⼀提的是,范围为1~15的字段编号需要⼀个字节进⾏编码,16~2047内的数字需要两个字节进⾏编码。注意:protobuf序列化出来的是二进制,放到String里打印会有误差,破解成本增⼤,所以ProtoBuf编码是相对安全的。也就是说,写一份.proto后缀的文件,再用相应的编译规则去编译,可以生成不同语言的代码。19000~19999不可⽤是因为:在Protobuf协议的实现中,对这些数进⾏了预留。要定义的结构化对象,我们可以给这个结构化对象中定义其对应的属性内容。,在项⽬中要有唯⼀性。
2024-12-18 21:56:07
937
原创 在做题中学习(80):归并排序
先把数组分为两块,再进行左区间的递归分割(先一直分割左区间),分割到只剩一个元素后就可以返回,此时就再去右边递归分割。两边都分割完返回后,在上层,把两区间(或者说两个有序数组合并成一个数组),一直向上合并,直到返回到第一层,就完成了归并排序。在把两个有序数组合并的时候,需要一个辅助数组,作用是:用它来存储两个有序数组合并后的结果,之后再赋给nums,才算结束一次合并。仔细想想归并和快排的思想是相似的,但可以分析出,归并其实像是二叉树的后序遍历,快排像是二叉树的前序遍历。
2024-12-09 20:28:09
300
原创 在做题中学习(79):最小K个数
函数的返回值要求是一个vector,而经过上面的分析,k个元素绝对是在a,b,c区间中的,所以即便递归结束后数组是乱序,只要从[0,k]区间内所有值都符合最小的k个元素,题目也说了可以以任意顺序返回。而如果 a + b >=k 说明,k > a了也就是不在a区间,而现在一定是 k > a,所以一定也在b这个区间中,而b都是= key的,所以直接返回即可,无需继续递归。看落在哪个区间,a区间全是
2024-12-08 22:07:31
298
原创 在做题中学习(78):数组中第K个最大元素
如果都不是,说明k > b + c了,所以k是很大的数字,那第k大就是一个很小的数字,肯定落在a区间,而因为现在我们跳过了 b+c个元素,所以要找的其实是第k - b - c个元素!而如果 b + c >=k 说明,k > c了也就是不在c区间,而第k个元素是在b这个区间中,而b是= key的,所以直接返回key即可。a,b,c分别是key 所代表的区间中值的个数。看落在哪个区间,c区间全是>key的,所以如果落在这个区间,就只在这个区间递归即可。
2024-12-07 22:56:13
381
原创 在做题中学习(77):快排
1.快排排一趟,递归分出来的左区间和右区间(一趟的思想,看我的前一个文章:颜色分类题解)3.优化:等概率的取区间内任意元素为key,复杂度渐进式最低,详情看算法导论。4.解惑:为什么一定要颜色分类的思想解决快排的一趟?2.递归:想清楚 函数头 和 返回条件怎么写。随机的基准值元素如何取?顺便分析:时间复杂度。
2024-12-06 15:06:13
744
原创 在做题中学习(76):颜色分类
3.nums[i] == 2,要保证[right,n-1]是全2,right--,swap(nums[right,nums[i]),处理完当前nums[i],不用i++,因为此时swap过去的nums[rigjt] 这个数依旧还没判断呢,所以此时不能i++1.nums[i] == 0,要保证[0,left]为全0,left++,swap(nums[left],nums[i]) ,处理完当前nums[i],i++2.nums[i] == 1, 要保证[left+1,i-1]是全1,所以 i++ 即可保证。
2024-12-05 22:58:19
442
原创 在做题中学习(75):基本计算器II
可以看到上图有 123这个数字,所以在遍历时,不能狭隘的遇到数字字符就开始入栈,要先用循环取出正确完整的数字。因为是通过操作符op来确定当前数字的行为,所以初始化时op = '+',让数字直接进栈。当遍历到3时,因为此时操作符存的是 * ,所以取栈顶元素和当前元素相乘,放入栈中。
2024-12-05 22:58:13
198
原创 在做题中学习(74):比较含退格的字符串
'#'时 push_back(s[i]) 出栈:s[i] == '#' 的时候,并且s.size() > 0,pop_back(s[i])循环结束得到结果。注意:如果真的用stack来模拟的话,最后赋值给string后,需要reverse逆序。细节:因为这题两个结构都是string,且都需要相同逻辑判断,所以单独封装个函数,减少代码量。思路:不用真的定义一个栈,用字符串string来模拟栈的行为。
2024-11-05 19:03:00
229
原创 在做题中学习(73):删除字符串中所有相邻重复项
入栈:push_back(s[i]) 出栈:s[i] == s.back()的时候,并且s.size() > 0,循环结束得到结果。注意:如果真的用stack来模拟的话,最后赋值给string后,需要reverse逆序。思路:不用真的定义一个栈,用字符串string来模拟栈的行为。
2024-11-04 22:09:56
388
原创 在做题中学习(72):最小栈
思路:stack里存pair,push时,first存当前值,而每次push都要更新pair的second,使它成为更小值,最后的getmin,只用取top().second即可拿到最小值。
2024-10-31 19:21:55
467
原创 在做题中学习(70):用栈实现队列
可以看出:其实在实现peek的时候,就需要push栈栈底的元素了,此时就需要把元素倒到另一个栈,里面myqueue的pop就可以用peek封装再pop实现。倒数据的条件,如上图。
2024-10-30 14:08:36
325
原创 在做题中学习(69):K个一组翻转链表
注意:到下一组逆序时,要考虑在谁后面连接?在下面代码的实现里,循环一组的k个长度时,不要用while(k--),这样会改变k的值,在下一组中k就会变0,无法继续。2.再进行n组k长度的链表的逆序(带虚拟头节点的头插法)思路:1.先求出链表长度,看可以分几组。
2024-10-24 15:35:29
543
原创 在做题中学习(68):重排链表
思路:slow走一步,fast走两步,这样fast走完,slow就能走到中间节点(奇数是中间,偶数是右边那个),再带虚拟头节点的头插法逆序后半部分链表,并且让slow节点的next置空,最后用虚拟头节点尾插分开的两个链表即可。注意:在leetcode链表OJ中,每次解引用结点,都得判断是否为空,否则它会判你解引用nullptr报错。
2024-10-23 20:16:04
374
原创 在做题中学习(67):两两交互链表中的节点
思路:引入一个虚拟头节点,让next指向head,并且在交换时,不要吝啬空间,多定义变量往后走,只要变量定义的足够,就不用怕连接的顺序问题,之后交换完1,2,让四个变量迭代。奇数个节点,考虑next是否为空,为空就结束循环。偶数个节点,考虑cur是否为空,为空就结束循环。
2024-10-23 20:15:46
222
原创 在做题中学习(66):两数相加
思路:定义一个变量t,存储相加后的结果,个位赋给新节点,十位(表示有进位)留下,累加到下一次加法(相当于+上进位)。while里即便cur1和cur2都为空了,但上次的t还存在进位,就继续添加节点,所以t也需要在while判断。
2024-10-22 22:01:51
240
原创 在做题中学习(64):提莫攻击
如果 b - a >= duration 那中间的时间段,就会受到duration秒中毒时间。如果 b - a < duration 那中间的时间段,只会遭受 b - a秒中毒时间。到最后一个数字,是最后承受中毒伤害的时间点,所以直接+=duration;思路:当timeSeries中的相邻两个数:a b ,
2024-10-21 15:21:24
452
原创 Reactor反应堆模式(流程图 + 代码)
网络/同步IO/Reactor · 伊人paranoid/Linux系统和网路编程 - 码云 - 开源中国 (gitee.com)
2024-09-12 19:25:32
333
原创 网络协议,OSI,简单通信,IP和mac地址
2004年,小明因为给他爹打电话(座机)费用太贵,所以约定一种信号,响一次是报平安,响两次是要钱,响三次才需要接通。
2024-06-15 19:30:45
986
原创 Linux————[多线程详解]
对于一个虚拟地址: 前10位 对应页目录中的地址 中10位 对应页表的页表项的地址 后12位 刚好2^12次方是4KB,所以就是页内偏移, 找一个物理地址: 通过页表项(页框)对应的起始物理地址+虚拟地址后12位对应的数据,就可以访问整个页框的数据。对于一个虚拟地址: 前10位 对应页目录中的地址 中10位 对应页表的页表项的地址 后12位 刚好2^12次方是4KB,所以就是页内偏移, 找一个物理地址: 通过页表项(页框)对应的起始物理地址+虚拟地址后12位对应的数据,就可以访问整个页框的数据。
2024-06-10 21:28:42
2480
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人