- 博客(28)
- 收藏
- 关注
原创 C++中的模板、STL和函数对象
在上面的例子中,std::function<void(int)> 类型在编译时就已经确定了,但是具体要调用哪个 lambda 函数则是在运行时由 some_condition 的值决定的。例如,std::vector 是一个模板类,它可以存储任何类型的对象。std::function 是一个模板类,它的类型参数在编译时确定。例如,std::sort 是一个模板函数,它可以对任何类型的元素进行排序,只要这些元素支持比较运算符。在C++中,模板的类型参数(包括STL容器和算法的类型)都是在编译时期确定的。
2023-11-16 21:21:49
95
原创 [230603 lc621] 任务调度器
so sad,今天状态很不好,这道题看了一下午加一晚上,屏幕上的字它不进脑子啊!还是深夜效率高!君独何为至于此,山非山兮水非水。
2023-06-04 06:30:00
105
原创 [230601 lc295] 数据流的中位数
我们使用大顶堆和小顶堆的数据结构,把所有数据看成一个有序数组,左半部分存放在大顶堆中,右半部分存放在小顶堆中,并维护大顶堆的大小始终与小顶堆的大小相等,或者大顶堆的大小比小顶堆的大小大 1。在这样的情况下,如果数组大小为奇数,那么大顶堆的堆顶元素就是中位数;如果数组大小为偶数,那么大顶堆的堆顶元素和小顶堆的堆顶元素的均值就是中位数。是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。在,当向数据结构中加入元素的时候,该怎么加。理解了大顶堆、小顶堆以后代码真的很好写。
2023-06-01 21:00:00
106
原创 [230531] 深入学习 DNS 协议
DNS 协议属于应用层协议,它的作用是根据域名查询到对应的 IP 地址,以便内核协议栈的 IP 模块构造 IP 报文。使用 DNS 协议的场景主要有在网站输入域名时需要查询域名对应的 IP 地址,还有 windows 下的 nslookup 程序可以直接查询域名的 IP 地址。
2023-06-01 06:00:00
103
原创 [230531 lc23] 合并 K 个升序链表
利用一个小顶堆,把数组中每一个链表的头节点都放入堆中,逐个弹出,弹出后,把该节点加入到结果链表,如果节点有下一个节点,就把下一个节点继续放入堆中,堆内会进行自动调整。负责把一个 list 数组中的链表两两合并,将数组规模缩减至原数组的一半,递归地调用外层递归函数,直至数组地大小为 1。关键点应该在需要定义一个虚拟头节点,固定好头节点,方便返回。请你将所有链表合并到一个升序链表中,返回合并后的链表。给你一个链表数组,每个链表都已经按升序排列。负责把给定的两个链表合并成一个链表。
2023-05-31 22:00:00
51
原创 [230529] 文件 IO 简明概述
Page Cache 是 Linux 内核管理的内存区域,通过 mmap 或 buffered I/O 将文件读取到内存空间实际上是读取到内核的 Page Cache 中。
2023-05-30 03:00:00
55
原创 [230529 lc215] 数组中的第K个最大元素
快速排序的实现:传入一个乱序数组,选中最右边的元素为主元,在剩余元素中使用双指针的做法,i 指针扫过的值均为小于主元的值,当 j 指针遍历完剩余元素后,交换 i 位置和主元位置上的元素,此时 pivot 就位,然后递归地调用 quickSort 函数对左右两边的子数组进行快排。堆排序的思路:先把原数组初始化为一个大顶堆,此时数组中第一个元素即最大元素,然后交换最大元素和最后一个元素的位置,接着调整前 size - 1 个元素为大顶堆,找到第二大的元素,交换位置。请注意,你需要找的是数组排序后的第。
2023-05-30 02:00:00
54
原创 [230527 lc84] 柱状图中最大的矩形
一道很典型的单调栈的题目。思路是利用单调栈找到每一个高度左边的第一个较小高度和右边的第一个较小高度,记录其下标,根据下标计算出对应高度所能达到的最大宽度,计算其面积。对于单调栈来说,理解到找较小元素应该使用递增单调栈、找较大元素应该使用递减单调栈即可。找当前元素左边的第一个元素,使用倒序遍历。左边元素数组应该初始化为 -1,右边元素数组应该初始化为 size。:求出以矩阵的每一行为底对应的柱状图,然后求每一个柱状图中的最大矩形面积,从中取最大值。求在该柱状图中,能够勾勒出来的矩形的最大面积。
2023-05-27 22:00:00
42
原创 [230527] 深入解析 TCP 三次握手
之前所说的 accept 会为此客户端连接分发新的 socket,但也仅仅是新的 socket,而没有新的端口(也对,不然人家上千万的高并发哪来那么多端口号。,内核会为每一个处于 listen 状态的 socket 分配两个队列:半连接队列(SYN 队列)和全连接队列(accept 队列),处于三次握手过程中的连接会在这两个队列中暂存信息。半连接队列中的连接都是不完整连接,当第三次握手的 ACK 报文到达以后,需要在半连接队列中找到对应的半连接,使用哈希表可以实现 O(1) 的时间复杂度。
2023-05-27 21:00:00
71
原创 [230526 lc42] 接雨水
维护一个非严格单调递减的单调栈,为了保证数组中的每一个元素都合法地入栈,要用一个循环去 pop 出比当前元素小的元素,并且在弹出的时候,对这个面积进行计算。我们可以把要求的雨水面积划分为一个一个小矩形,每个小矩形的底都是一,高度取每个高度左边的最大高度和右边的最大高度的最小值,减去当前的这个高度。我们需要从左到右遍历数组,找到左边的最大高度;从右到左遍历数组,找到右边的最大数组。使用单调栈来解题,关键点在确定小矩形的长和宽。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2023-05-27 06:00:00
53
原创 [230525 剑指60] n个骰子的点数
具体的方法是,当求 n 个骰子的结果概率时,固定 n - 1 个骰子结果为 x,利用 n - 1 个骰子结果为 x 的概率乘以 1 / 6,分别计算 x + 1、x + 2、…从 n 个骰子的角度来说,n 个骰子的某一个结果的概率不是一次性算出的,而是通过累加得到的。对每一个点数组合进行相加,得到结果和,然后对相同的结果和进行统计,除以 6 ^ n,就可以得到每一种结果的概率。的特点,利用这一点在传参的时候就可以深拷贝出来一个 obj,这样进行交换的时候就不会把原来的 obj 更改。难点在递推公式,如上。
2023-05-25 22:30:00
48
原创 [230524 剑指59] 队列的最大值
C++ 中的队列 queue 和 deque 本身提供的 push 和 back 都是 O(1) 时间复杂度的。deque 是双端的,可以从队尾加入和弹出元素、从队首加入和弹出元素,对应接口分别是 push_back 和 pop_back、push_front 和 pop_front。queue 是单向的,从队尾加入元素、从队首弹出元素,使用的接口分别是 push 和 pop。我们可以使用一个辅助的数据结构:单调队列,队列的队头元素,就是当前队列中的最大值。时间复杂度都是O(1)。
2023-05-25 02:00:00
45
原创 [230523 剑指51] 数组中的逆序对
整体思路是使用归并排序的算法。在归并排序的合并过程中,若右边子数组指针指向的元素小于左边子数组指针指向的元素,则意味着出现了逆序对,逆序对数量为左子数组中未合并的元素数量。在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。别的就不说了,就是觉得这个归并排序里面的 tmp 数组引用传参写得非常妙啊!重复使用,节约空间,good.易错点在合并过程中 if 分支需要先判断下标合法性以防止越界。重难点在递归实现归并排序。
2023-05-24 05:00:00
36
原创 [230523] 堆排序
heapify(递归过程)的目的是使原 array 中每一个非叶子节点都下沉至满足大顶堆/小顶堆限制条件的最底层(说大白话就是,如果在一次 heapify 中破坏了大顶堆/小顶堆的性质,则要继续调用 heapify 维护大顶堆/小顶堆的性质)(注意:由于在第一轮 heapify 中我们已经构造好了一个大顶堆,所以在 swap 以后只有堆顶元素是非法的,所以在 heapSort 中只需要对堆顶元素进行 heapify)第十轮 heapify 结束后,补充:利用小顶堆构造降序序列。
2023-05-24 03:00:00
45
原创 [230522 剑指49] 丑数
但是因为前面的数乘以 5 的值可能会大于后面的数乘以 2 或 3 的值,所以我们不能单纯地按顺序记录丑数序列中每一个数乘2、乘3、乘5的结果。**(确定解法)从后往前看:**因为丑数只包含质因子2、3、5,所以每一个丑数都是由在它之前的丑数序列中的某一个数乘 2、乘 3 或乘 5 得到的,于是我们可以想到动态规划的解法。在构造丑数序列时,选取下标为 a 的丑数乘 2 的结果、下标为 b 的丑数乘 3 的结果、下标为 c 的丑数乘 5 的结果中的最小值,先加入到丑数序列中,然后对应的下标递增。
2023-05-22 23:00:00
45
原创 [230521] C++ STL string 类的简单实现
想起来腾讯一面,面试官上来先让我手撕 string 类,没绷住,当时也没及时补,现在补补。
2023-05-22 05:00:00
41
原创 [230521 剑指44] 数字序列中某一位的数字
数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。**易错点在:**int 类型的 count 会发生上溢,应把 count 定义为 long long 类型。**重难点在:**在第 2、3 步中,理解到在第 1 步的迭代结束后,n 为新的 n(可以理解为新的下标)请写一个函数,求任意第n位对应的数字。没有,能把这题找规律写出来就不错了。则第 2 步的计算公式为。第 3 步的计算公式为。
2023-05-21 17:00:00
56
1
原创 [230520 剑指43] 1~n整数中1出现的次数
在当 n 为 INT32_MAX 时,digit 会溢出,故需要把 digit 定义为 long 变量。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。在理解到固定当前位数字为 1 时,找到的最大的数是当前位为 1 且不超过 n 的最大的数。我们需要维护几个变量:high、low、cur、digit。,求1~n这n个整数的十进制表示中1出现的次数。并且要知道最小的数、最大的数和计算个数的关系,例如。当分析完当前位以后,迭代几个变量。遍历肯定是超时的,所以我们采用。
2023-05-21 06:00:00
60
原创 [230516 剑指38] 字符串的排列
求一个字符串的全排列,本质上就是穷举。我们可以把这个问题看作“有 n 个空位,我们使用给定的 n 个字符从左往右填满这 n 个空位,并且每个字符不能重复使用”。在回溯函数内部,遍历 n 个字符,尝试将某一字符放入该空位,然后进行下一次递归调用,对下一个空位进行相同的操作。下一个排列:已知当前的一个排列,快速得到字典序中下一个更大的排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。在写代码的过程中描述每一个变量、每一个参数的意思。输入一个字符串,打印出该字符串中字符的所有排列。
2023-05-16 16:00:00
60
1
原创 [230515 剑指37] 序列化二叉树
这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。istringstream 可以将一个字符串与一个流相关联,从而以流的方式对字符串进行提取,这个特性使 istringstream 在分析输入时非常有用。这道题的难点在建树时需要对字符串进行切割,我们可以利用 C++ 中的 isstringstream 的优势很好地解决这一点。这题分为两个部分:把给定的二叉树序列化,和根据给定的序列还原二叉树。
2023-05-16 14:00:00
49
原创 [230421] 可扩展哈希
可扩展哈希是一种动态哈希,可扩展哈希的哈希函数也是动态变化的。主要技术:directory 和 bucketdirectories:每一个 directory 都有一个唯一的 id,当进行哈希扩展时 direcotry 的 id 可能会改变。directory 中存储的是对应 bucket 的指针。哈希函数返回 directory 的 id,用于找到对应的 bucket。directory 的数目 = 2 ^ global depth。buckets: 存储实际数据。
2023-04-22 02:00:00
996
1
原创 [230420 leetcode15] 三数之和
要找三元组,最原始最暴力的方法就是三层遍历,时间复杂度 O(n^3)。但就像双指针可以把二维遍历降为一维遍历一样,使用双指针也可以把三维遍历降为二维的。**剪枝逻辑:**核心算法前对数组进行排序,若三元组第三位(即 k 位)元素大于 0,则可跳出当前双指针循环。注意:答案中不可以包含重复的三元组。k 位去重(k 是从右向左移动的)在尝试优化时浅浅使用了一下。,判断是否存在三元组。
2023-04-21 22:00:00
315
1
原创 [230420] 简单了解 Nginx 服务器
Nginx 是一种 web 服务器,基于 rest 架构风格,以统一资源描述符 URI 或统一资源定位符 URL 作为沟通依据,通过 HTTP 协议提供各种网络服务。Nginx 由 C 语言开发,是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上Nginx 的使用基于事件驱动架构,使得其可以支持数以百万级别的 TCP 连接高度的模块化和自由如那件许可证使得第三方模块层出不穷。
2023-04-20 18:00:00
141
1
原创 第一章 软件工程概述习题答案
软件是包括程序、数据及其相关文档的完整集合。软件是一种具有抽象的逻辑实体软件的开发是一种逻辑思维成熟的过程,而无明显的制造过程软件没有磨损和老化问题,但存在软件退化问题软件的开发依然很原始软件是高度复杂的逻辑体软件危机(Software Crisis)指由于落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。软件工程包括三个要素:方法、工具和过程。软件工程方法为软件开发提供“如何做”的技术。
2023-04-14 10:38:31
163
1
原创 [230115 | 第328场周赛] 前缀和与差分 | 滑动窗口 | 树形DP
[230115 | 第328场周赛] 前缀和与差分 | 滑动窗口 | 树形DP
2023-01-17 16:34:54
121
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人