自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 1206. 设计跳表

不使用任何库函数,设计一个 跳表 。跳表 是在 O(log(n)) 时间内完成增加、删除、搜索操作的数据结构。跳表相比于树堆与红黑树,其功能与性能相当,并且跳表的代码长度相较下更短,其设计思想与链表相似。

2023-04-09 00:40:24 536

原创 区间DP 1039. 多边形三角剖分的最低得分 | 1000. 合并石头的最低成本

你有一个凸的n边形,其每个顶点都有一个整数值。给定一个整数数组values,其中values[i]是第i个顶点的值(即顺时针顺序)。假设将多边形剖分为n - 2个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有n - 2个三角形的值之和。

2023-04-07 22:35:12 450

原创 139. 单词拆分(DP) | 140. 单词拆分II (回溯)

给你一个字符串s和一个字符串列表wordDict作为字典。请你判断是否可以利用字典中出现的单词拼接出s。

2023-04-05 21:51:13 641

原创 面试题 17.05. 字母与数字 | 2488. 统计中位数为 K 的子数组(前缀和+哈希表)

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。

2023-03-11 11:00:55 463

原创 224. 基本计算器 | 43.字符串相乘

'+'、'-' 运算符只能给栈内push值,而'*'、'/' 运算符可以从栈内pop出被乘数或被除数,再将乘除运算后的结果push入栈内。注意:num1[i] 和 num2[j] 的乘积对应的就是 res[i+j] 和 res[i+j+1] 这两个位置。'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)s 由数字、'+'、'-'、'('、')'、和 ' ' 组成。的乘积,它们的乘积也表示为字符串形式。

2023-03-02 22:25:14 381

原创 1798. 你能构造出连续值的最大数目 | 330. 按要求补齐数组

也是贪心的思路,要求连续,所以每次往数组中添加的数 x

2023-02-04 19:31:46 428

原创 Linux多线程Web服务器(C++实现)

如果全部写完了,需要判断是否建立了HTTP长连接,如果建立了,那么就要尽量在一个TCP连接内完成多条HTTP报文的传送,所以进入process函数,判断此时收集到的请求是否可以成功解析,如果成功则继续监听EPOLLOUT,让本条请求的响应在下一轮epoll_wait中就绪,如果失败,说明此时收集到的请求仍然不足,改为监听EPOLLIN,继续读取客户端请求。当然,本文实现的基于多线程的Web服务器,一旦主线程的监听服务器终止,派生的子线程也会随之终止,大家都关闭了,也就不存在上述的重启失败问题。

2023-01-13 12:27:53 2505

原创 HTTP连接(读取请求+解析请求+生成响应+回送响应)

通过ssize_t HttpConn::read(int* errno_) +bool HttpConn::process()函数+上面的ssize_t HttpConn::write(int* errno_)函数完成。因为生成请求的部分将响应头置于缓冲区buffer内,将响应体即要回送的文件,通过mmap方式建立了内存映射,获得一个指向被映射区的指针char* mmFile。给struct iovec vec[2] 赋值,vec[0]保存响应头的首地址和长度,vec[1]保存响应体的首地址和长度。

2023-01-12 20:48:53 908 2

原创 生成HTTP响应报文

提取path的后缀,然后利用哈希表SUFFIX_TYPE,得到对应值(例如:文件后缀为html,则对应值应为text/html )根据请求写出相应的HTTP响应头,然后再将path上的文件置于响应体,通过socket发往客户端。本文实现的响应头,包含200、400、403、404四种状态码及其对应的原因短语,响应头部分有。其余是响应头,由头部字段名称(Connection) :值(keep-alive) 构成。响应体内应为path对应的文件,为了提高服务器从磁盘中读取响应文件的速度,采用。

2023-01-12 18:07:15 1036

原创 解析HTTP请求报文(GET、POST)

使用状态机和正则表达式完成了对HTTP请求报文的解析,支持解析GET报文和POST报文(仅限Content-Type: application/x-www-form-urlencoded)。由于计划完成的web服务器需要实现展示主页(GET)用户登录(POST)用户注册(POST)获取图片(GET)获取视频(GET)五个功能,所以web服务器的请求解析模块满足:若为GET请求,可根据状态行信息,完成对请求内容地址的转换,以及请求头内其他内容的提取。若为POST请求。

2023-01-05 23:02:26 10318 5

原创 数据库连接池(C++11实现)

1、初始连接数(initSize):初始连接量表示连接池事先会和MySQL Server创建的initSize数量的SqlConn连接。在完成初始连接量之后,当应用发起MySQL访问时,不用创建新的MySQLServer连接,而是从连接池中直接获取一个连接,当使用完成后,再把连接归还到连接池中。2、最大容量(maxCapacity)连接池的最大容量即连接池内的最大连接数。

2023-01-01 19:02:30 1446 2

原创 同步+异步日志系统(C++实现)

对于一个服务器而言,不论是在调试中还是在运行中,都需要通过打日志的方式来记录程序的运行情况。日志写入函数与工作线程串行执行,由于涉及到I/O操作,当单条日志比较大的时候,同步模式会阻塞整个处理流程,服务器所能处理的并发能力将有所下降,尤其是在峰值的时候,写日志可能成为系统的瓶颈。将所写的日志内容先存入中,写线程从阻塞队列中取出内容,写入日志。

2023-01-01 12:37:03 5505 5

原创 缓冲区Buffer类的设计(参考Muduo实现)

Buffer的功能需求:Buffer类的设计目的是再创造一层应用层缓冲区。其对外表现为一块连续的内存(char* p, int len),以方便客户代码的编写。size() 可以自动增长,以适应不同大小。内部以 std::vector来保存数据,并提供相应的访问函数。,一个 std::vector,和两个size_t的readerIndex,writerIndex用来表示读写的位置。此外,buffer类应模仿平时使用的容器,提供访问数据元素的这里提供。

2022-12-29 22:52:55 1661 6

原创 基于C++11的线程池实现(ThreadPool)

线程池: 当进行并行的任务作业操作时,线程的建立与销毁的开销是阻碍性能进步的关键,因此需要在线程池内创建多个线程,无限循环从任务队列中取走任务并执行,提高性能。

2022-12-26 21:32:24 987 3

原创 基于最小堆实现的定时器(HeapTimer)

将所有定时任务中超时时间最小(最快到期)的一个定时任务的超时值作为心搏间隔,这样一旦下一次调用心搏函数时,tick()函数被调用,此时这个超时时间最小的定时任务必然到期,就在tick()函数中处理这个超时任务。,std::swap(i, j)默认采用深拷贝,所以如果交换的两个数据结构内含有指针成员,应该自己定制swap函数,交换指针即可,无需进行默认的深拷贝动作。本文实现了一个基于最小堆的定时器,插入O(logn)、删除O(1)、查找O(1),效率较高。

2022-12-25 16:38:14 1340 4

原创 基于C++11实现的阻塞队列(BlockQueue)

当缓冲区满的时候,生产者会进入阻塞状态,当下次消费者开始消耗缓冲区的数据时,生产者才会被唤醒,开始往缓冲区中添加数据;当缓冲区空的时候,消费者也会进入阻塞状态,直到生产者往缓冲区中添加数据时才会被唤醒。因为要实现线程安全的函数,所以将pop函数的接口设计为需要放入一个自己的T item作为删除数据的拷贝。生产者不会在缓冲区满的时候继续向缓冲区放入数据,而消费者也不会在缓冲区空的时候,消耗数据。1、析构函数:清理队列中的所有成员,唤醒所有阻塞中的生产者、消费者线程。2、生产者线程应该调用的函数。

2022-12-25 15:39:56 4288 2

原创 878. 第 N 个神奇数字(二分查找+数学)| 1819. 序列中不同最大公约数的数目(枚举+数学)

一个正整数如果能被a或b整除,那么它是神奇的。给定三个整数nab,返回第n个神奇的数字。因为答案可能很大,所以返回答案109 + 7后的值。26。

2022-11-22 13:28:48 434

原创 805.数组的均值分割(回溯+折半搜索+数学)

给定你一个整数数组nums我们要将nums数组中的每个元素移动到A数组 或者B数组中,使得A数组和B数组不为空,并且。如果可以完成则返回true, 否则返回false。对于数组arr,是arr的所有元素的和除以arr长度。true我们可以将数组分割为 [1,4,5,8] 和 [2,3,6,7], 他们的平均值都是4.5。false。

2022-11-16 00:00:11 375

原创 790.多米诺和托米诺平铺(DP)|1664.生成平衡数组的方案数(DP)

有两种形状的瓷砖:一种是2 x 1的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。给定整数 n ,返回可以平铺2 x n的面板的方法的数量。109 + 7的值。平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。n = 35五种不同的方法如上所示。n = 11。

2022-11-12 13:52:17 415

原创 864.获取所有钥匙的最短路径(BFS+位图技巧)

给定一个二维网格grid,其中:'.'代表一个空房间'#'代表一堵'@'是起点小写字母代表钥匙大写字母代表锁我们从起点开始出发,一次移动是指向四个基本方向之一行走一个单位空间。我们不能在网格外面行走,也无法穿过一堵墙。如果途经一个钥匙,我们就把它捡起来。除非我们手里有对应的钥匙,否则无法通过锁。假设 k 为 钥匙/锁 的个数,且满足,字母表中的前k个字母在网格中都有自己对应的一个小写和一个大写字母。换言之,每个锁有唯一对应的钥匙,每个钥匙也有唯一对应的锁。

2022-11-10 16:12:21 216

原创 764.最大加号标志(DP)

764. 最大加号标志在一个 的矩阵 中,除了在数组 中给出的元素为 ,其他每个元素都为 。表示 返回 中包含 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 。一个 阶由 组成的 “轴对称”加号标志 具有中心网格 ,以及4个从中心向上、向下、向左、向右延伸,长度为 ,由 组成的臂。注意,只有加号标志的所有网格要求为 ,别的网格可能为 也可能为 。示例 1:输入: n = 5, mines = [[4, 2]]输出: 2解释: 在上面的网格中,最大加号标志的

2022-11-09 17:39:39 500

原创 堆排序(二叉堆)

上浮操作用于给堆中添加新元素:首先将新元素加至堆的末尾(数组末尾),然后不断。堆排构造堆的过程也可以利用上浮操作来做,但是效率比下沉构造低很多。

2022-11-01 17:14:28 153

原创 1235.规划兼职找工作(DP+二分查找)

j 是最大的满足 endTime[j]

2022-10-23 00:06:53 341

原创 940.不同的子序列II

7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。3 个不同的子序列分别是 "a", "aa" 以及 "aaa"。因为结果可能很大,所以返回答案需要对。

2022-10-14 23:26:59 318

原创 801.使序列递增的最小交换次数 | 31.下一个排列

dp [i][0] 表示不交换下标为 i 的两数,让两数组[0......i]范围内的数,严格递增所需操作的最小次数。dp [i][1] 表示交换下标为 i 的两数,让两数组[0......i]范围内的数,严格递增所需操作的最小次数。我们有两个长度相等且不为空的整型数组。在一次操作中,我们可以交换。两个数组均为严格递增的。

2022-10-10 22:48:06 410

原创 856.括号的分数

分解的过程中有两种情况,AB和(A),如何判断是这两种中的哪一个?可以从左向右遍历字符串s,将' ( '记为 1,' ) '记为 -1,记录它们的总和。如果遍历完所有的括号后,总和才为0,那么就是(A)形式的,返回值为2 * score(A);如果遍历了一部分总和就为0了,那么就是AB形式的,返回值为score(A)+score(B)。对字符串s进行分解,分而治之。int scoreOfParentheses(string s)的返回值是当前字符串s的分数。注意ASCII码和数字之间的转换。

2022-10-09 16:43:24 124

原创 2429. 最小 XOR(位运算)

num1中1的个数为c1,num2中1的个数为c2,如果c1>c2,就将num1最低的c1-c2个1变成0;运用“贪心思想”,要让反转后的值最小,num1中高位的1就要变成0,如果k比num1中1的个数还多,那么就要让num1中低位的0变成1,这样得到的值最小。若num2中有k个1,那么“x异或num1的值最小”等价于————将num1中的k位反转(1变0,0变1)所得的最小值。x的二进制表示中1的数目和num2相同,且要求x异或num1的值最小。当x和num1相等时,异或的值最小,为0。

2022-10-04 00:30:09 582

原创 777. 在LR字符串中交换相邻字符 | 面试题 01.09. 字符串轮转 | 1247.交换字符使得字符串相同

所以用两个指针分别指向start与end,遇到X就穿过去,如果start[i]==end[j],若都是R,那就得保证i=j,因为L只能穿过溶质X向左移动。首先,如果s1和s2的长度不一样,那么无论怎么轮转,s1都不能轮转成s2。字符串 s1+s1 包含了所有 s1​可以通过轮转操作得到的字符串,只需要检查 s2是否为 s1+s1 的子字符串即可。把字符串中的X想象成一种溶质,L只能向左移动穿过溶质X,R只能向右移动穿过溶质X。

2022-10-02 17:23:42 538

原创 645.错误的集合 | 448.找到所有数组中消失的数字 |面试题17.19.消失的两个数字

缺失两数之和为12 (4+8),除以2是6 (4和8在6的一左一右),1 + 2 + ... + 6 = 21,减去nums中已经存在的6左边的数,即1+2+3+5+6=17,得4(因为这里面少加了4嘛),12-4=8得到另一个数。因为数组nums中的数字不重复,所以缺失的两数之和除以二的值" mid "一定在缺失的两数之间(比小的大,比大的小),再计算1~mid的总和,减去nums中在1~mid之间已经存在的整数,那么剩下的肯定就是缺失的两数中左边的那个。例如:nums=[1,2,3,5,6,7,9]

2022-09-26 22:21:42 194

原创 659.分割数组为连续子序列

因为如果能接进去,那么这个子序列肯定是满足条件的(连续且长度大于等于3),而如果让它当开头,却不一定能组成一个长度为3的子序列。(可能包含重复数字),请你将它们分割成一个或多个长度至少为 3 的子序列,其中每个子序列都由连续整数组成。为什么要先判断是否可以接到已有的子序列中?给你一个按升序排序的整数数组。如果可以完成上述分割,则返回。

2022-09-26 21:20:12 145

原创 42.接雨水 | 11.盛最多水的容器

给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。6上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。9。

2022-09-22 19:24:33 313

原创 241.为运算表达式设计优先级(分治算法)

给你一个由数字和运算符组成的字符串expression,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以返回答案。生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过104。[0,2]

2022-09-19 22:52:04 250

原创 392.判断子序列 | 792.匹配子序列的单词数

给定字符串和,判断是否为的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?truefalse。

2022-09-17 11:00:15 290

原创 括号相关问题

给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。

2022-09-12 19:58:30 281

原创 岛屿问题(用DFS遍历二维数组)

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = []输出:1。

2022-09-11 00:10:52 1155

原创 292.Nim游戏 | 877.石子游戏 | 319.灯泡开关 | 754.到达终点数字 | 89.格雷编码

假设 Alice 和 Bob 都发挥出最佳水平,当 Alice 赢得比赛时返回 true ,当 Bob 赢得比赛时返回 false。如果 Bob 拿走前 3 颗,那么剩下的是 [4,5],Alice 拿走后 5 颗赢得 10 分。如果 Bob 拿走后 5 颗,那么剩下的是 [3,4],Alice 拿走后 4 颗赢得 9 分。这表明,取前 5 颗石子对 Alice 来说是一个胜利的举动,所以返回 true。第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。3.你移走3颗石子。

2022-09-10 22:55:34 684

原创 382.链表随机结点 | 398.随机数索引

int pick(int target) 从 nums 中选出一个满足 nums[i] == target 的随机索引 i。如果存在多个有效的索引,则每个索引的返回概率应当相等。给你一个可能含有 重复元素 的整数数组 nums ,请你随机输出给定的目标数字 target 的索引。int getRandom() 从链表中随机选择一个节点并返回该节点的值。// getRandom() 方法应随机返回 1、2、3中的一个,每个元素被返回的概率相等。给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。

2022-09-10 10:41:39 226

原创 204.计数质数 | 372.超级次方

首先从 2 开始, 2 是一个素数,那么 2 × 2 = 4, 3 × 2 = 6, 4 × 2 = 8…然后发现 3 也是素数,那么 3 × 3 = 6, 3 × 4 = 12, 3 × 5 = 15…5 也是素数,那么5 x 5 = 25,5 x 6 = 30,5 x 7 = 35…解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7。输入:a = 2147483647, b = [2,0,0]输入:a = 1, b = [4,3,3,8,5,2]输入:a = 2, b = [3]

2022-09-08 22:08:48 169

原创 172.阶乘后的零 | 793.阶乘函数后k个零

因为有因子2和因子5,2X5=10,就可以提供一个0,而n!中只要是偶数就至少可以提供一个因子2,即因子2比因子5多的多,所以n!中尾随0的个数(拿到一个因子5就可以和因子2凑出一个尾随0)。例如, f(3) = 0 ,因为 3!而 f(11) = 2 ,因为 11!= 1 * 2 * 3 * ... * x,且 0!给定 k,找出返回能满足 f(x) = k 的非负整数 x 的数量。,符合 k = 5 的条件。

2022-09-07 20:05:05 156

原创 常用位操作

191.位1的个数编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

2022-09-06 22:49:24 253

空空如也

空空如也

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

TA关注的人

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