自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一二维前缀和/差分详解

高效处理数组与矩阵的区间操作,本质是空间与时间的战略置换!从一维到二维逐级递进,详细阐述每一种类型。

2025-06-08 00:24:59 586

原创 页表:从虚拟内存到物理内存的转换

摘要:虚拟内存技术通过独立编址实现内存隔离与保护,使每个程序误以为独占内存。页表是核心数据结构,将虚拟地址转换为物理地址,包含权限位以保护内核数据。单级页表存在空间浪费问题,二级页表和四级页表通过分层优化空间效率。快表(TLB)作为缓存加速地址转换。页表设计需平衡空间效率、查询速度和灵活性,无完美方案,需根据场景取舍。

2025-05-25 23:36:08 633

原创 【笔试强训day39】

本文摘要了三道算法题解:1. 统计字符串中出现频率最高的字母(使用哈希表);2. 基于字符频率构建哈夫曼编码求最短编码长度(优先队列);3. 用完全平方数凑整数的动态规划解法(空间优化版)。三道题分别考察了基础统计、贪心算法和动态规划的应用,代码实现简洁高效。

2025-05-24 09:37:10 738

原创 【笔试强训day38】

文章摘要:本文介绍了三个算法题目及其解决方案。第一题“天使果冻”要求在前x个果冻中找出美味度第二大的果冻,通过维护最大值和次大值数组实现快速查询。第二题“dd爱旋转”涉及矩阵的180度旋转和行镜像操作,通过统计操作次数并应用行镜像和列镜像来实现。第三题“小红取数”要求在数组中选择一些数,使其和尽可能大且为k的倍数,使用动态规划方法解决,通过状态转移方程计算最大和。每个题目都提供了详细的解题思路和代码实现。

2025-05-22 23:12:33 1045

原创 【笔试强训day37】

本文介绍了三个算法问题的解决方案。第一题是旋转字符串,通过将字符串A倍增并在其中查找字符串B来判断是否可以通过旋转得到B,时间复杂度为O(n)。第二题是合并k个已排序的链表,使用小堆(优先队列)将所有链表的头节点放入堆中,依次取出最小节点并合并,时间复杂度为O(nlogn)。第三题是滑雪问题,通过记忆化搜索计算矩阵中最长的递减路径,避免重复计算,时间复杂度为O(nm)。每个问题都提供了详细的解题思路和代码实现。

2025-05-20 22:25:22 845

原创 HTTPS核心机制拆解

因为HTTP协议是明文传输的,明文数据会经过路由器、WiFi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了,进而导致隐私泄漏。

2025-05-19 19:50:32 1252

原创 智能指针:C++内存管理的现代解决方案

如果要用一句话来定义智能指针的话,就是:智能指针 = 对象化指针 + 自动生命周期管理。智能指针它实际上就是一个封装了原始指针的类模板,然后通过RAII机制来确保内存安全。RAII:核心就是将资源的生命周期与对象的生命周期进行绑定,确保对象在离开作用域时能够自动释放其资源。

2025-05-10 19:29:00 822

原创 【笔试强训day21】

区间两端的字符相同,那么去区间 [ i + 1,j - 1]找到该区间内最长的回文子序列,然后加上两端的那两个字符就得到了[ i , j ] 区间上的最长回文子序列。状态转移方程 ---------> dp [ i ] [ j ] = dp [ i + 1, j - 1] + 2;

2025-04-18 00:16:42 976

原创 【算法基础】高精度加减乘除法

这里顺带说明一下数组要开多大,也就是下面代码中N要定为多大的值。高精度加减乘除法都是一样的道理。比如高精度加法中,数据大小不超过10^500,那么开501个长度就够用了。个位为10^0,十位为10^1,百位为10^2,长度为三的数组可以表示到999,所以3位长度已经足以表示不超过10^2的数了,进而501个长度也足以表示不超过10^500的数了。当然,我们也可以开大一点,N = 1e6 + 10,这样就绝对完全够用了。

2025-04-17 09:50:05 848

原创 【笔试强训day20】

根据上图,我们可以看到,对于 i 位置,它可以独立成一个子数组,那么它的最大和就是arr[ i ]。当然,i 也可以和前面的结合形成子数组,它可能和前面的一个元素结合,也可能两个三个甚至全部元素结合形成子数组,在那么多的情况中,只取以i - 1位置为结尾的子数组最大和,而这个最大和正好是存放在dp[i - 1]中。所以最大和就是dp[i - 1] + arr[i]。

2025-04-16 11:32:09 803

原创 【笔试强训day19】

双指针。两个指针分别从两端开始向中间靠拢,如果left对应的字符串和right指向的字符串中有相同的字符,那么就有可能组成回文串。反之,则不可能。

2025-04-14 22:46:03 872

原创 【笔试强训day18】

TopK问题。 这道题只需按照订制的排序方法排序,然后取前k个即可。关键在于制定排序方法——如果甜度不相等,甜度高的排在前面;如果甜度相等,对应酸度小的排在前面。然后注意数据范围即可。

2025-04-13 20:22:17 918

原创 【笔试强训day17】

这样,在遍历到(i,j)这个元素的时候,我们直接去存储行之和的数组和存储列之和的数组了拿数据就可以了,减少了很多计算。综上,第一天吃或者第三天吃得到的快乐值最大,但是第三题吃羞耻度会小于第一天吃,所以最终选择第三天吃。通过上面的演示,可以看到这题就是一道固定长度的滑动窗口问题,窗口长度为k(效果持续的天数)。如果第一天吃下,快乐值会持续两天(k = 2),快乐值总和为8(第一天获得快乐值为3,第二天获得快乐值为5),羞耻度总和为10.因为1+2+3=6,1+2+4=7,1+3+4=8,2+3+4=9。

2025-04-13 00:36:27 775

原创 【笔试强训day16】

遍历字符串A,遇到%则判断它的后面一个字符是不是s,如果是的话,就替换成arg中的字符。比如字符串A中 i 位置对应的字符是%,那么在确保 i + 1不越界的情况下去检查 i + 1位置的字符是否为s,如果是的话, 就把arg中对应的字符拿过来替换,然后指针指向arg的下一个位置。给定一个很长的 DNA 序列,以及限定的子串长度 N ,请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。14本身不是质数,但是14可以组合出41,是质数,所以14是神奇数。

2025-04-11 21:38:03 758

原创 【C++取经之路】lambda和bind

引用一位大佬的一句话——“Use lambdas if you can, and std::bind  if you must.”这句话出自 Scott Meyers 的经典著作《Effective Modern C++》,书中明确指出:与 std::bind相比,lambda几乎在所有方面更优越。

2025-04-11 15:30:29 1411

原创 【笔试强训day15】

dd当上了宣传委员,开始组织迎新晚会,已知班里有n个同学,每个同学有且仅有一个擅长的声部,把同学们分成恰好m组,为了不搞砸节目,每一组里的同学都必须擅长同一个声部,当然,不同组同学擅长同一个声部的情况是可以出现的,毕竟一个声部也可以分成好几个part进行表演,但是他不希望出现任何一组的人过多,否则可能会导致场地分配不协调,也就是说,她希望人数最多的小组的人尽可能少,除此之外,对组内人员分配没有其他要求,她希望你告诉她,这个值是多少,如果无法顺利安排,请输出-1。问题是,枚举到哪,也就是枚举的上限是多少?

2025-04-11 01:50:59 582

原创 【笔试强训day14】

预处理用做的就是:统计数组中每个数字的总和,存放进一个hash数组中,由题意,选中一个数以后,该数+1和-1的数就不能再选,在hash数组中的表现就是,选中一个数后,它的相邻位置就不能再选了(类似于打家劫舍问题,不知道也没关系)。如果选择 i 位置的值,那么前面i - 1位置就不能选,就是f [ i ] 的最大值就是i对应的和+不选i - 1位置的最大分数,而不选 i - 1的最大分数就是存在g[i - 1]中,故得到f[i]的状态表示。圈起来的数就是我们取到的最大的水平值。把取出的这些数加起来就是答案。

2025-04-10 00:23:16 1044

原创 【笔试强训day13】

题目描述:来源:牛客网牛牛最近在玩炉石传说,这是一款一对一对战的卡牌游戏,牛牛打算努力冲上钻五分段,获得丰厚的天梯奖励。炉石传说的段位可以用星数来表示,具体规则为:若牛牛本场失败,则扣除一星;若牛牛本场获胜,需要看牛牛是否触发了连胜奖励,若牛牛获得了至少三连胜(即本局对局的上一局和上上局都获胜)则获得kkk星,否则获得一星。现在给出牛牛游玩的nnn场记录,请你判断牛牛最终的星数和初始星数的差。

2025-04-09 00:24:42 999

原创 Json快速入门

Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化,它实现了将多个数据对象组织成 为Json格式字符串,以及将 Json 格式字符串解析得到多个数据对象的功能,独立于开发语言。

2025-04-08 20:43:00 470

原创 从 select 到 epoll:拆解 I/O 多路复用的演进与实战

I/O 多路复用(I/O Multiplexing)是为了解决 高并发场景下传统阻塞式或非阻塞式 I/O 模型的效率缺陷 而诞生的核心技术。阻塞式IO,无论是单线程阻塞式IO还是多线程阻塞式IO,在数据未就绪时线程会被挂起,直到数据就绪后才恢复执行。而且,多线程还涉及到线程切换,以及内存开销。线程切换那是需要时间的,频繁的切换会导致效率降低。至于非阻塞式的IO,轮询高频发生,浪费CPU资源。

2025-03-30 22:29:57 1056 1

原创 【计算机网络】TCP协议技术细节全解析:与UDP的核心差异深度对比

在一个TCP连接中,TCP每发送一个报文段,就会对此报文段设置一个超时重传计时器,如果超时重传计时器已经到期,但还未收到接收方的确认,那么发送方就会重发该报文段,并将重传计时器复位。

2025-03-21 09:48:18 840

原创 【计算机网络】一文读懂TCP:从三次握手到拥塞控制的全面指南

TCP(传输控制协议)是互联网数据传输的基石之一。在OSI模型中,它属于传输层协议,负责端到端(End-to-End)的可靠通信,是构建HTTP、HTTPS、FTP等应用协议的底层支撑。如果说IP协议是互联网的“公路网”,负责将数据包从源地址送到目标地址,那么TCP就是公路上的“物流系统”,确保包裹(数据)完整、有序、无误地送达。在确保可靠性的同时,还以合理的复杂度来换取性能的提升。

2025-03-20 10:47:16 836 1

原创 【计算机网络】不要连接,直接起飞——UDP的速度与激情

在线游戏中角色动作流畅、直播无延迟——这一切离不开一个看似“不靠谱”的协议:UDP。为什么像视频通话、实时对战游戏这样高要求的场景,反而选择不保证可靠性的UDP呢?不管是可靠还是不可靠,我更喜欢理解为TCP/UDP的一种特性,而不是优缺点,它只是采用了另一种设计哲学:用可控的“不完美”,换极致的效率——不用连接,直接起飞。

2025-03-15 14:56:49 957 1

原创 【Linux取经之路】进程信号的处理

终于,从信号的产生、保存走到了信号的处理!三步上篮该落地了。在进程信号的产生、进程信号的保存这两篇博客中,我一直在回避一个问题——信号什么时候被处理。在之前,我一直都说是在合适的时候,并没有具体的说什么时候合适。到了这,我就直说了。信号的处理通常发生在进程从【内核态】返回【用户态】时。这是因为进程在内核态时可能正在执行一些关键的系统调用或中断处理程序,此时处理信号可能会干扰这些操作的正常进行。因此,操作系统通常会在进程从内核态返回用户态时,对信号进行检测及处理。

2024-11-18 17:34:52 1071

原创 【Linux取经之路】进程信号的保存

上一篇文章谈了进程信号的产生,这篇文章我们来聊一聊进程信号的处理。废话不多说,我们直入主题。我们已经知道了信号是如何产生的以及信号是由操作系统发送给指定进程的。那么,有以下几个问题。1)进程接收到操作系统发送的信号后,会立即处理吗?如果不是立即处理,那什么时候处理?不会立即处理,而是会在合适的时候处理。合适的时候处理,这不废话吗?是的,关于什么时候处理我们后面会说。这里我们先通过一个例子来感性的理解。张三正在寝室里打王者荣耀,这时接到了外卖小哥的电话说外卖到学校东门了,过来取一下。

2024-11-14 17:11:39 1197

原创 【Linux取经之路】进程信号的产生

命令:kill -l其中,1到31号信号为普通信号,34到64号信号为实时信号。你可能会问——32和33号信号去哪了?这两个编号可能保留或者未使用。这里我们只谈普通信号。光看这堆信号没意思,我们挑一个常用的信号来讲一讲顺便引出操作系统是如何给进程传递信号的。9号信号——SIGKILL:强制终止一个进程,用法为kill -9 进程pid。它的操作比较见到,我就不演示了。下面我们谈谈操作系统是如何给进程发送信号的。操作系统是通过修改进程PCB内的位图来将信号发送给进程的。

2024-11-12 13:41:17 954

原创 中缀表达式转后缀表达式(逆波兰表达式)及如何计算后缀表达式

首先说说什么是中缀表达式,中缀表达式中,操作符是以中缀形式处于操作数的中间。例如,在表达式“3 + 4”中,“+”是中缀操作符,位于两个操作数“3”和“4”之间。对于我们而言,它最直观。下面说说后缀表达式,逆波兰表达式(Reverse Polish Notation,RPN),也被称为后缀表达式,是一种算术表达式的表示方法。在这种表示法中,运算符被写在操作数的后面,而不是像常规的中缀表达式那样写在操作数的中间。

2024-10-20 18:43:10 1154

原创 【C++取经之路】红黑树封装set

本文参考《STL源码剖析》中SGI STL对红黑树的结构设计,涉及到红黑树迭代器的实现等,所以在读这篇文章之前,我希望你对红黑树有一定的了解,比如在红黑树插入时的变色和旋转操作,最好自己实现过。不然这篇文章对你可能不太友好,因为本文对红黑树的结构设计较为复杂,插入时的操作细节不会在本文详细说明。说实话,封装set对其实很简单,难点在于前期的红黑树设计上,在设计上的一些细节还是很有挑战的。下面我们进入正题,一起领略写SGI STL的大佬们的风采。//旋转时需要访问父节点//颜色//数据域{}

2024-09-24 23:38:23 834

原创 【数据结构取经之路】图解红黑树

AVL-tree之外,另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree),这名字听起来除了很抽象外,还颇具大哥味哈,会不会很难?客观地说,难度是有的,下面我们细细道来。//结点的颜色//红黑树结点的定义//结点的左孩子//结点的右孩子//结点的父节点//结点的颜色T _data;//结点的数据域{}以上就是红黑树节点定义,但有两个问题:为什么需要指向父节点的指针?为什么要将结点的默认颜色设置成黑色?先来回答第一个问题,在旋转时需要访问父节点,所以引入了指向父节点的指针。

2024-09-20 22:52:06 1043

原创 【数据结构取经之路】图解AVL树

前两点我相信大家都没有疑问,可能有疑问的点在于:为什么需要指向父节点的指针?请看上图,假设值为-1的结点是新插入的结点,那么在插入之前值为1的结点的平衡因子为0。插入值为-1的结点之后,值为1的结点的平衡因子需要更新为-1。新插入的值为0的结点的左右指针均指向空,那么我们如何能找到新插入节点的父节点,然新它的平衡因子呢?这时引入指向父节点的指针就可以帮助我们简单快速的解决这个问题。通过该指针,我们很容易找到每一个节点的父节点,方便插入节点时修改父节点的平衡因子。

2024-09-17 16:29:25 1148

原创 【Linux取经之路】Linux项目自动化构建工具-make/makefile & git三板斧

make是一个解释makefile中命令的工具。执行clean时,它实际上执行的是它对应的依赖方法,确实把所有的.o文件和目标文件都删除了。make是 Linux 系统中广泛使用的一个自动化构建工具,它根据用户定义的规则(通常保存在一个名为 makefile的文件中)来自动编译和链接程序。makefile中的OBJS就是我们定义的一个变量,我们通过这个变量来简化了makefile,下面我们看看变量的基本语法。我们在使用make的时候,它会去读取makefile的内容,并根据内容直接去给它编译相关的文件。

2024-09-16 12:43:56 1548

原创 【Linux取经之路】编译器gcc/g++的使用 & 调试器gdb的使用

程序的发布方式有两种,debug模式和release模式,gcc/g++直接编译出来的二进制程序,默认是release模式。如果我们要使用gdb调试,就必须在编译的时候加上-g选项。我们可以看到,加了-g选项生成的_g_test文件要比没加-g选项生成的test文件要大,这是因为_g_test文件里包含了调试信息,而test中没有包含。在谈gcc/g++的使用之前,我们先来复习编译的4个阶段,也算是为下面的内容做一些铺垫,请看思维导图。其中,-O0表示没有优化,-O1为缺省值,-O3的优化级别最高。

2024-09-15 14:15:18 1177

原创 【Linux取经之路】软件包管理器yum&编辑器vim及其配置

在Linux下安装软件,一个通常的办法是下载程序的源代码,并进行编译,得到可执行程序。但是,这样未免太麻烦了吧!这时,一些能人挺身 而出,把一些常用的软件提前编译好,做成软件包放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安 装。软件包和软件包管理器就好比App和应用商店的关系。yum(Yellow dog Updater, Modified) 是Linux下非常常用的一种包管理器,主要应用 在Fedora,RedHat,Centos等发行版上。

2024-09-14 11:25:02 1209

原创 【Linux取经之路】用户&权限管理

事先,我已经将home目录的权限改为777,也就是说所有用户都具有这个目录的写(w)权限,并且在该目录下,我以root的身份创建了一个名为test的文件,然后我从root切换到普通用户pcz,接着尝试删除root在home目录下创建的文件test,结果还删除的很成功!首先,我创建了一个名为test的文件,我们可以看到,test的所有者和所属组为pcz,所有者对应的权限为rw-,可读可写不可执行,所属组对应的权限为rw-,可读可写不可执行。当我们以普通用户的身份安装软件包的时,往往权限不够,需要提权。

2024-09-12 22:54:45 760

原创 【C++取经之路】map的详细介绍及其使用

理论元素这个名词是出自文档的,我只是知识的搬运工。其实这个底层的红黑树的设计有关。大概是这样子的:它有一个哨兵位结点(上方的),两边的就是理论元素了。

2024-09-05 21:32:51 1033

原创 【C++取经之路】set的详细介绍及其使用

再谈容器,先问一个问题:何为容器?《STL源码剖析》一书中是这么解释的——容器,置物之所也。根据“数据在容器中的排列”特性,容器可以分为序列式容器和关联式容器两种。序列式容器,其底层为线性序列的数据结构,里面存储的是数据本身。关联式容器,其底层是红黑树(一种平衡搜索树),里面存储的是结构的键值对,也是存储数据本身的。set和map均为关联式容器。

2024-09-05 14:59:04 950 1

原创 【堆、快速选择排序】探寻TopK问题的解决方案

TopK问题在面试中常常被问到 —— 比如,在10亿个整数里,找出最大的前100个。在海量数据中查找出重复出现的元素或者去除重复出现的元素也是常考的问题。所以在对待TopK问题上,我们可不敢掉以轻心。下面,我们进入正题。TopK问题就是在一个数据集合中找出最大的前K个或者最小的前K个。在面试中遇到这个问题时,通常它的数据量很大,动不动就上亿或者海量数据。这就导致我们无法直接在内存中对所有数据进行排序或者说排序的时间成本很高等等,因此这类问题通常不采取直接排序再查找的做法。下面我们看看几种常见的做法。

2024-09-04 09:05:44 1094

原创 【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现

在一些场景下面,有大量数据需要判断是否存在,而这些数据不是整形,导致位图就派不上用场。这时,时代无比呼唤一种新的解决方案,布隆过滤器也就应运而生了。布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好得多,缺点是有一定的误判率和删除困难。

2024-09-02 22:03:20 1478

原创 push_back()和emplace_back()的区别

emplace_back()向容器末尾添加元素时,直接在容器内部构造这个元素,而不是先构造一个对象再拷贝或移动到容器中。在底层实现时,emplace_back()的参数会被转发到容器内部新元素的构造函数中。这意味着元素的构造直接在容器的内存位置上进行,避免了不必要的复制或移动操作。push_back()向容器末尾添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中。push_back() -> 构造 + 拷贝构造 / 构造 + 移动。emplace_back() -> 构造。

2024-09-01 15:22:25 277

原创 【数据结构取经之路】位图全解

位图(Bitmap)是一种非常高效的数据结构,主要用于处理大量数据的快速查找、去重等操作。它利用每一位(bit)来表示某个元素是否存在或某种状态,从而极大地节省了存储空间。在内存和存储空间相对受限的环境下,位图尤其有用。下面,我们先瞅一眼C++标准库里的位图,然后再抽出它的核心部分来自己实现。

2024-09-01 12:10:25 1407

空空如也

空空如也

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

TA关注的人

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