自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用户态协议栈

本文简易阐述用户态如何完成内核的协议栈,实现一个udp协议的协议栈

2022-09-14 20:49:46 2564 2

原创 posix API与网络协议栈的实现原理

本文主要介绍 Posix API 与 网络协议栈 之间的关系;三次握手、数据传输、四次挥手的过程。Posix API的意思就是可移植性操作系统接口,也就是linux下的可移植到别的系统的API接口。无论是现在的哪种高级语言,涉及到的网络编程底层都会追溯到linux下的网络编程原理。...

2022-08-28 01:59:09 1921

原创 Linux服务器百万并发实现与问题排查

实现一台服务器的百万并发,服务器支撑百万连接会出现哪些问题,如何排查与解决

2022-08-23 22:35:16 2411

原创 剑指 Offer 53 - II. 0~n-1中缺失的数字

利用二分法找到第一个与当前位置不符合的位置就行,前面都是有序的如果缺一个肯定会造成无序(注意,因为全有序说明少了最后一个,此时left也指向了最后一个)

2023-09-01 23:27:40 113

原创 剑指 Offer 31. 栈的压入、弹出序列

这道题问的就是第二个序列有没有可能是第一个序列的压栈出栈的玩法。这里直接模拟一个栈把pushed的元素一个个压进去,再拿一个指针从头指向popped序列。

2023-08-30 16:16:12 134

原创 75. 颜色分类

这道题要求扫描一遍直接排序完,这里就需要用到多指针的办法。下面的代码用到了三个指针分别代表着指向第0个分区的尾指针,第1个分区的尾指针和第2个分区的尾指针。(注意这里的尾巴指针并没有相应的值)遍历时候根据当前的值进行判断,如果当前的值为0说明需要往0分区添加一位0,这时候第1分区和第2分区就得腾位置出来,因为这个数组是连着的,如果新出现了0的话其他两个分区往后挪,0分区就会占用1分区的一个值,这时候1分区就需要多添加一个1,2分区也会因为1分区的挪动被占用一个值,也需要多填一个2。

2023-08-24 18:57:40 145

原创 155. 最小栈

这道题用到了两个栈来维护,第一个栈就正常的使用,第二个栈用来维护最小值,当新来的值大于第二个栈的top值的话就没必要加进来,因为之后每次取最小值的时候都会返回这个top值,直到pop的时候将这个值弹出。那么这个栈top为最小 top-1的值就是当top不在时候整个栈的最小值以此类推。当pop出的值是top值的时候说明这个栈的最小值不再是这个top值了。

2023-08-22 16:01:48 111

原创 旋转排序数组

153.寻找旋转排序数组中的最小值33.搜索旋转排序数组。

2023-08-22 12:22:53 110

原创 207. 课程表

首先要完全理解题意,这道题的[a,b]并不是b满足了a就可以真正的学习a这门课了,因为a还有可能需要其他选修课的条件。类似下图。这题的思路在于使用合适的数据结构来存储,这里用hash表来存储如果1这门课可以修了之后,可以让哪些课所需条件–。定义一个每个课所需要的条件的数组。关键就在于当条件都满足也就是所需条件为0的时候,应该让他发挥他的作用。

2023-08-18 14:49:35 61

原创 994. 腐烂的橘子

这道题的思路在于使用一个队列,存储每一个腐烂的橘子的位置,每一分钟都把队列中已有的烂橘子同时开始污染周围的好橘子,把好橘子给存入队列,如果周围都已经是烂橘子了就不用继续花时间来感染了,本题类似层序遍历的写法。

2023-08-17 00:14:02 106

原创 138. 复制带随机指针的链表

这题的主要思路在于利用hash先来。第二次遍历为new节点的next字段和random字段赋值,old的next和random会在这个hash表中存在并有和其映射的new节点,此时就可以为new节点赋值完,最后返回头结点。(不用担心next和random不存在的问题,如果不存在map默认返回nil刚好对应要赋的值)

2023-08-15 21:10:00 105

原创 73. 矩阵置零

这题要求在原地修改,空间复杂度为常数级。这题的主要思路在于用第一行第一列来保存整行整列是否为0的状态。用两个bool变量储存第一行和第一列后续是否需要变动。你可能会想如果改变第一行第一列的值但是第一行第一列本来不需要变,那怎么找回原有的值?这个不用担心,因为只要中间有了0,这个第一行或者第一列的标识迟早也会变成0,只不过早变晚变的原因。这里需要注意的一点为[0][0]的位置,如果你在给每行每列赋值的时候从这个位置开始的话,会影响第一行第一列这个用来暂存的全部数据,导致全部变成0。

2023-08-11 11:54:22 1044

原创 560. 和为 K 的子数组

本题的主要思路为创建一个哈希表记录,在遍历这个数组的时候查询有没有sum-k的值在哈希表中,如果有,说明有个位置到当前位置的和为k。有可能不止一个,哈希表负责记录有几个sum-k,将和记录下来。这里把每个以i结尾的结果都算上了,所以不用担心不全等问题。

2023-08-10 14:41:11 253

原创 3. 无重复字符的最长子串

这题做法为滑动窗口(为什么用滑动窗口?如果暴力以每个字符开头开始暴力的话时间太久了,滑动窗口左边直接去掉的是完全没必要作为开头的所以利用滑动窗口一齐排除,省去了大部分的步骤),需要判断新加入窗口的右边有没有在这个出现过,如果没有出现过说明没有重复那就继续扩大窗口的右边,如果有重复的值,那就要注意一下了。这个无重复字符子串不可能再包括前面那个与它重复的字符了,因为是子串那么重复前面的也不能要了但是前面那个重复的后面那些字符串肯定和这个新出现的不相等还可以继续保留。这里需要注意一下,出现重复的。

2023-08-09 22:42:48 135

原创 128. 最长连续序列

这题代码的要求为o(n)复杂度,那就只能空间来换时间了,O(n)常常与哈希表相关。本题的思路也在于哈希表的解法。遍历每个元素,如果元素不存在于哈希表的话,也就是新数加入就为其创建一个键值对。这个键值对的val代表的意思为加入了这个字符之后,。如果是旧数加入的话,因为肯定用过它,如果没用过它,它也撼动不了最长的地位,这个序列的某个位置加入才会使它变长,也就是说这旧数的加入没有意义,就没有必要加进来。那么这个新加入的数字怎么样知道自己的出现会不会导致所在的序列变为最长呢?

2023-08-08 00:53:09 98

原创 42. 接雨水

这题关键在于每个地方接的水为左边最大和右边最大的最小值减去这个地方的高度。还需要注意的一个地方在于两边作为边界的地方是不会接水的。这里我用动态规划的方式记录当前位置左边最大和右边最大的值。这里需要注意的一个点是如果左边没有比当前位置大的当前位置应该赋值为多少?这里直接赋值为当前高度值,因为最后会取两边大值的最小值减去当前值。(如果填了本身之后,右边也会出现两种情况,如果右边有比这个大的值,那就不影响最终值,如果右边没有比这个大的值的话,也会为其赋值为本身的高度,不影响最后结果的计算)

2023-08-04 14:36:37 111

原创 583. 两个字符串的删除操作

本题也是动态规划的解法,dp[i][j]代表的意思就是word1中0~i的字符串和word2中0 ~ j的字符串相等需要的步数,也是通过判断尾部字符是否相等的方式,如果相等的话也就不需要改动了取dp[i-1][j-1]的步数就行,如果不相等的话需要找个最小值,有可能是i结尾字符串和j-1结尾字符串重合度高步数少,也有可能是j结尾字符串和i-1结尾字符串重合度高步数少,两者取步数最小的情况,还要加上肯定变动的步数1。

2023-08-01 23:18:20 210

原创 115. 不同的子序列

这题dp[i][j]的含义为s中0~i的字符串中有多少个子串为t的0 ~ j这个字符串,dp[i][j]的推导关键在于判断s[i]和t[j]是否相等的时候,如果相等的话可以选择是否需要i位置的字符参与,如果不需要的话有s[i-1][j]种,如果需要i位置的字符参与说明肯定要用这个字符,那这个字符是定死了和t字符串第j个相等的,那么s[i-1][j-1]有多少种这种就有多少种。所以s[i]和t[j]相等的时候为这两种情况的和。

2023-08-01 22:30:52 247

原创 golang利用go mod巧妙替换使用本地项目的包

拉了两个项目下来,其中一个项目依赖另一个项目,因为改动了被依赖的项目,想重新导入测试一下。

2023-07-27 21:58:38 1459

原创 122. 买卖股票的最佳时机 II 和 买卖股票的最佳时机含手续费

两题的本质是一样的,只不过含手续费多了一个手续费,手续费可以在买的时候一并扣掉就行。这两题的关键在于到理解dp数组创建的意义,这两题dp数组创建的意义为,dp[i]就可以根据dp[i-1]也推出最优情况,只需要考虑前面的最优和新的一天的变故就能推出到今天为止的最优情况。dp[0]代表未持有状态 dp[1]代表持有状态。当天dp[0]的结果=之前最好的或者今天卖掉股票后目前的利润。

2023-07-26 21:43:43 137

原创 139. 单词拆分

i循环和j循环的顺序很重要,如果i循环在外面的话有时候需要其他字符前面的支持才能判断以当前位置结尾的是true还是false,这时候如果没有前面的支持直接判错,后面用其他元素来填充的时候也没机会了,永远都是false了。

2023-07-25 21:25:18 207

原创 279. 完全平方数

这题也是完全背包问题,看看这个容量能被多少个装满而且要最少。一开始思路可能是直接给个最接近的完全平方数,然后对剩下的差值进行组装,因为动态规划的原因可以直接知道这个差值用的最少数量。问题就出在这个差值上面,差值有多有少,可能差值太多导致这个n组成要用掉很多完全平方数。既然肯定要组装,那就把比它小的完全平方数都遍历一遍然后看看和差值组成数量的和哪个最小(这样就包含了全部情况但也没包含全部情况)。

2023-07-24 22:32:13 47

原创 474. 一和零

dp数组创建的含义:当m,n最大为i,j的时候最多可以放几个子集。a,b代表这个字符串有多少个0多少个1注意点:如果你直接把一个元素进行遍历的话,dp[i][j]前面的值有些是加过这个新元素进行过计算的。就会干扰这个值。所以这个就创建一个三维数组来保留原有二维数组dp[][]的值,利用原有的进行计算。最后就得到了所有元素都试过的最大值。

2023-07-23 22:41:01 163

原创 494. 目标和

这题的思路在于肯定会有一个组成的组合可以减去剩下组合(sum-组合)得到target,式子x-(sum-x)=target。需判断这个x是否为负值,因为创建的数组为正数。这里还需要注意如果数组有很多0的情况,这时候需要将组成0的多个情况累加起来,不能直接初始化为1了。

2023-07-23 20:55:43 124

原创 491. 递增子序列

之前一直是自己排好序的数组,因为相同的都是相连的,只需要通过i!=start && nums[i]==nums[i-1]然后判断continue。而这题相同的可能不是连着的单凭此方法有漏洞,例如:当第一个1已经散开去完成它的使命的时候,后面的第一个1因为前面不是和自己相同的,也会完成一下自己的使命,就造就了重复。

2023-07-18 21:52:12 223

原创 golang关于成员变量使用:=

结构体成员变量不能与:=一起用,这是一个语法错误。

2023-07-15 21:27:27 484

原创 669. 修剪二叉搜索树

通过递归返回节点的方式,注意当这个节点值在范围内的时候就可以继续返回,只需要注意下它左右节点的赋值即可。如果不在范围内的时候,这个时候二叉树的特性就展露出来了不在范围内的可能只有两种:1.在这个区间的左边因为二叉搜索树的特性,在左边代表着这个节点和它左边的所有节点全都小于,这时只需把右边校验好的节点返回回去就行2.在这个区间的右边因为二叉搜索树的特性,在右边代表着这个节点和它右边的所有节点全都大于,这时只需把左边校验好的节点返回回去就行。

2023-07-15 17:31:28 234

原创 二叉树的迭代遍历

迭代就是不使用递归,使用压栈入栈的形式实现遍历,关键在于使用过的节点代表着不再用了,再其前面加一个。(如果左右节点为空切记不要加入相应的遍历,不然会对空指针进行操作)

2023-07-06 23:11:31 75

原创 541.反转字符串

这题代码简洁写法就在于,每次都位移2 * k直到 +2* k超过了这个长度,把最后一截的k+a情况和平常的2。k情况看为一种情况都是反转k个,另一种情况就是不足k个,也就是加上k个就超过长度了。简单说就是+k分为超过长度,代表一种情况。+k不超过长度,代表一种情况。

2023-07-03 21:42:15 104

原创 Redis 事务

当事务中的命令出现语法错误时,整个事务在 exec 执行时会被取消。exec 之后的提示是 exec 被忽略,事务被取消,因为之前的错误。这组命令在执行过程中会被顺序地、一次性全部执行完毕,只要没有出现语法错误,这组命令在执行期间是不会被中断。​ 如果事务中的命令没有语法错误,但在执行过程中出现异常,该异常不会影响其它命令的执行。这组命令的执行结果是被写入到内存的,是否持久取决于 Redis 的持久化策略,与事务无关。这组命令中的某些命令的执行失败不会影响其它命令的执行,不会引发回滚。没有复杂的隔离级别。

2022-12-08 22:16:37 371 1

原创 HyperLogLog操作命令、Geospatial操作命令、发布订阅命令

虽然用户可以使用 COUNT 选项去获取前 N 个匹配元素,但因为命令在内部可能会需要对所有被匹配的元素进行处理,所以在对一个非常大的区域进行搜索时,即使使用 COUNT 选项去获取少量元素,该命令的执行速度也可能会非常慢。功能:这个命令和 GEORADIUS 命令一样,都可以找出位于指定范围内的元素,但该命令的中心点是由位置元素形式给定的,而不是像 GEORADIUS 那样,使用输入的经纬度来指定中心点。另外,在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。

2022-12-08 21:12:25 535

原创 BitMap类型常用命令

offset:每个 BitMap 数据都是一个字符串,字符串中的每个字符都有其对应的索引,该索引从 0 开始计数。这个 offset的值的范围是[0,2^32 -1],即该 offset的最大值为 4G-1,即 4294967295,42 亿多。另外,对于不存在的 key 被当成是空字符串来处理,因此对一个不存在的 key 进行 BITCOUNT 操作,结果为 0。key:BitMap 是 Redis 的 key-value 中的一种 Value 的数据类型,所以该 Value 一定有其对应的 key。

2022-12-08 21:09:40 800

原创 list类型常用命令及其底层数据结构

格式:LPUSH key value [value …] 或 RPUSH key value [value …]功能:将一个或多个值 value 插入到列表 key 的表头/表尾(表头在左表尾在右)说明:如果有多个 value 值,对于 lpush 来说,各个 value 会按从左到右的顺序依次插入到表头;对于 rpush 来说,各个 value 会按从左到右的顺序依次插入到表尾。如果 key不存在,一个空列表会被创建并执行操作。当 key 存在但不是列表类型时,返回一个错误。执行成功时返回列表的长度。格式

2022-12-06 16:58:26 938

原创 Hash与ZSet的常用命令以及其底层数据结构

格式:HSET key field value功能:将哈希表 key 中的域 field 的值设为 value 。说明:如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中,旧值将被覆盖。如果 field 是哈希表中的一个新建域,并且值设置成功,返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖,返回0。格式:HGET key field功能:返回哈希表 key 中给定域 field 的值。说明:当给定域不存在或是给定 key 不存在时,返

2022-12-06 16:55:48 633

原创 set常用命令与其底层数据结构

格式:SADD key member [member …]功能:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member元素将被忽略。说明:假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误。格式:SMEMBERS key功能:返回集合 key 中的所有成员。说明:不存在的 key 被视为空集合。若 key 中包含大量元素,则该命令可能会阻塞 Redis服务。所以生产环境中一般不使用该命令,而使用 sscan 命令

2022-12-06 16:50:26 622

原创 string类型常用命令与其底层数据结构

格式:SET key value [EX seconds | PX milliseconds] [NX|XX]功能:SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数。说明:如果 value 字符串中带有空格,则该字符串需要使用双引号或单引号引起来,否则会认为 set 命令的参数数量不正确,报错。格式:SETEX/PSETEX key seconds value功能:set expire,其不仅为 key 指定了 value,还为其设置了生存时间。setex 的单位为秒,psete

2022-12-06 16:46:52 483

原创 写日志模块与zookeeper的作用

将在服务端的方法都注册到znode节点上去,节点的内容储存该服务端的ip地址和端口(znode节点只存储简单的byte字节数组),当客户端访问的时候先访问服务注册中心,如果服务注册中心有相应的方法就get节点的内容,然后根据内容的ip与端口进行远程程序调用。通知回调机制,用来监听父节点中子节点的变化,如果有变化,会有zk主动的告知。zk服务端和服务端通过心跳包进行通信,证明服务方法还可以使用,当断开连接的时候,心跳包不再发送了就将服务注册中心上的相应方法节点自动删除。解除耦合,在本项目中起到。

2022-11-04 22:52:37 695

原创 框架的重要组成

再根据方法名字找到方法,通过服务类提供的GetRequestPrototype()方法获得定义的request类和response类,再进行参数的ParseFromString就可以得到具体的参数了。因为stub桩类的方法具体实现就是内部的成员变量调用自己的成员方法,成员方法CallMethod是一个纯虚函数,需要多态的方法继承下来之后重写所以有了MprpcChannel。通过 -i 传的文件进行判断文件中的服务的ip与port和zk的ip和port。

2022-11-04 22:51:35 427

原创 muduo库的安装

历经九九八十一难才安装好这个muduo库,期间遇到了很多的问题,写下来记录一下希望之后看到的能避坑,不要走我的弯路。

2022-10-27 23:31:32 932

原创 RPC遇到的错误

本文记录一下在编写RPC项目时遇到的一些问题。写的时候不小心在头文件中多写了个类的构造函数的实现就导致我遇到函数重定义这样的错误。因为在头文件中定义了一个函数,在预处理时头文件展开,每个文件都有了一个该函数的定义,因为编译时是分隔的,所以到链接时,将所有文件关联在一起时,发现每个包含了该头文件的文件中有一个相同函数的声明,编译器就会报出重定义的错误。windows每行最后有个\r\n,linux每行最后有个\n.string的有参构造传char*这种char类型数组遇到\0就不再往后读了。

2022-10-26 21:17:35 472

空空如也

空空如也

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

TA关注的人

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