自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(369)
  • 问答 (1)
  • 收藏
  • 关注

原创 Linux IPTables

本文简要介绍了Linux iptables防火墙工具。iptables通过表、链和规则组织网络包处理,主要包含raw、filter、nat、mangle和security五张表,每张表包含不同功能的链(如INPUT、FORWARD等)。最常用的是nat和filter表,分别用于地址转换和包过滤。文章解释了链的调用规则,并提供了常用命令示例,如查看、清空表、设置DNAT/SNAT和端口重定向等。最后列出了官方文档参考链接,建议用户查阅更详细资料。

2025-08-27 16:27:26 155

原创 I/O 多路复用:select、poll、epoll

select和poll是Linux系统中常用的I/O多路复用机制。select通过位操作管理文件描述符,受限于1024的最大数量,使用fd_set结构体数组来跟踪描述符状态。poll则没有数量限制,采用pollfd结构体管理事件,将读写事件合并处理,通过位与运算判断事件发生。两者都提供了高效的I/O监控能力,但poll在可扩展性和使用便利性上更优。示例代码展示了select和poll的基本用法,包括描述符设置和事件检测。

2025-08-27 10:47:01 253

原创 Linux IO模型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO

本文介绍了五种I/O模型的特点和实现方式:1)阻塞I/O模型简单直接但会阻塞进程;2)非阻塞I/O通过轮询避免阻塞但消耗CPU;3)I/O多路复用单线程监听多个文件描述符;4)信号驱动I/O通过信号通知数据到达;5)异步I/O完全不阻塞进程。文章通过示意图和代码示例(包括信号处理和POSIX AIO)详细说明了每种模型的实现机制,分析了各自的优缺点,为理解不同I/O模型的工作方式提供了清晰的参考。

2025-08-26 20:44:32 354

原创 leetcode_ 41 缺失的第一个正数

本文介绍了寻找未排序数组中缺失的最小正整数的两种解法。暴力解法通过排序后遍历查找,时间复杂度为O(n log n)。更优的原地哈希法利用数组本身作为哈希表,通过置换或标记法实现O(n)时间复杂度和O(1)空间复杂度。置换法通过交换元素到正确位置,标记法将存在元素的位置标记为负数。两种方法最终都通过二次遍历找到第一个不符合条件的位置,确定缺失的最小正整数。

2025-08-26 11:14:01 200

原创 leetcode_189 轮转数组

本文介绍了三种解决数组循环右移k位的方法:1)使用临时数组存储移动后的元素,空间复杂度O(n);2)环状替换法,通过计算最大公约数确定替换轮次,时间复杂度O(n);3)三次反转法,通过反转整个数组和子数组实现高效移动。其中第三种方法最优,时间复杂度O(n)且空间复杂度O(1)。文章还分析了k取模运算的必要性和环状替换的数学原理。

2025-08-24 23:04:50 753

原创 Linux: TUN/TAP

本文介绍了Linux中的tun/tap虚拟网络设备。tun/tap设备是用户空间的虚拟网卡,通过用户空间直接收发数据包。tun工作在网络层,需要配置IP地址;tap工作在数据链路层,需要配置MAC地址。文章详细说明了使用ip命令配置tun/tap设备的方法,并通过CS144项目示例展示了具体实现。同时介绍了应用程序通过/dev/net/tun设备与内核交互的编程接口,需要使用ioctl系统调用注册设备。最后提供了相关参考文档链接。

2025-08-24 10:39:29 140

原创 C++20: std::span

摘要: std::span是C++20引入的一种轻量级视图,用于安全访问连续内存序列(如数组、vector等)。它能自动推导容器大小,支持数据修改(不同于std::string_view),提供subspan等切片操作。但需注意,C++26前不包含边界检查,越界访问会导致未定义行为。示例展示了其基本用法、数据指针获取及潜在风险,建议结合size()方法自行管理边界。参考cppreference和Modernes C++相关文档获取更多细节。 (148字)

2025-08-24 09:17:09 293

原创 C++ 20: Concepts 与Requires

摘要:C++20的Concepts特性通过约束模板参数类型,解决了传统模板编程中类型不匹配导致的复杂错误问题。文章介绍了Concepts的基本用法,如使用std::is_integral限制参数类型,比较了使用Concepts与传统模板在编译期错误检测上的差异。详细讲解了四种requires表达式(简单限制、类型限制、复合限制和内嵌限制)的定义方式,并通过求最大公约数、运算符重载等示例演示其应用。Concepts能显著提升模板代码的可读性和错误提示友好性,是泛型编程的重要改进。

2025-08-23 21:17:34 819

原创 C++11: std::weak_ptr

摘要: weak_ptr是C++智能指针之一,用于解决shared_ptr循环引用问题。它不增加引用计数,通过expired()检查对象是否失效,并用lock()恢复为shared_ptr。典型应用包括打破循环引用(如双向链表节点管理)和作为缓存句柄(只访问不管理生命周期)。示例代码演示了其构造、引用计数及避免内存泄漏的能力。相比shared_ptr相互引用导致的内存泄漏,weak_ptr能确保资源正确释放。

2025-08-23 19:52:02 209

原创 leetcode_238 除自身以外的数组乘积

这篇文章介绍了如何在不使用除法的情况下,计算数组中每个元素除自身外的乘积。通过前后缀分解的方法,分别记录每个元素的前缀积和后缀积,然后将两者相乘得到结果。初始解法使用两个数组存储前后缀积,空间复杂度为O(n);优化后的版本直接在结果数组上计算,空间复杂度降至O(1)。两种方法的时间复杂度均为O(n),适用于处理大规模数据。

2025-08-21 21:03:54 196

原创 leetcode_ 76 最小覆盖子串

本文介绍了在字符串s中寻找涵盖字符串t所有字符的最小子串的两种解法。第一种使用不定滑动窗口,每次检查窗口是否满足条件,时间复杂度O(n+52m)。第二种优化方法通过记录字符差值来减少判断时间,时间复杂度O(n+m)。两种方法的空间复杂度均为O(52)。文章还提醒注意处理无解情况,并提供了C++实现代码。

2025-08-19 11:41:39 990

原创 leetcode_239 滑动窗口最大值

本文探讨了滑动窗口最大值问题的三种解法:优先队列、单调队列和分块预处理。优先队列通过维护元素值和下标来获取最大值,时间复杂度O(nlogn)。单调队列利用递减特性高效获取窗口最大值,时间复杂度O(n)。分块预处理方法将数组分为k大小的块,预处理前后缀来快速计算窗口最大值,时间复杂度O(n)。三种方法各有特点,其中单调队列在时间和空间复杂度上表现最优。

2025-08-19 11:18:25 818

原创 leetcode_438 找到字符串中的所有异位词

本文介绍了在字符串s中查找所有p的异位词子串的方法。主要使用滑动窗口技术,提出了三种解决方案:1)定长窗口+双哈希表,通过比较字符频次判断异位词;2)定长窗口+单哈希表,维护字符频次差值和差异计数器;3)不定长滑动窗口,动态调整窗口使字符频次满足条件。

2025-08-17 18:17:52 775

原创 leetcode_42 接雨水

摘要:本文探讨了LeetCode"接雨水"问题的三种解法。前后缀最大值法通过计算每个位置左右两侧的最大高度,确定积水量,时间复杂度O(n)。双指针法优化空间复杂度至O(1),通过比较左右指针所指位置的最大高度来计算积水。单调栈法以填坑思想逐步填充积水,复杂度均为O(n)。其中双指针解法最为高效,通过动态维护左右最大高度来避免额外空间消耗。三种方法均基于"当前位置积水量等于左右最大高度的较小值减去当前高度"这一核心原理。

2025-08-16 17:42:19 844

原创 leetcode_ 739 每日温度

摘要:本文讨论了如何求解每日温度问题,即对数组中的每个元素找到其后第一个更高温度出现的天数。给出了两种解法:暴力枚举法(时间复杂度O(n²))和单调栈法(时间复杂度O(n))。重点介绍了单调栈的两种实现方式,包括从左往右遍历(维护非递减栈)和从右往左遍历(维护严格递减栈)。单调栈方法能高效解决这类"下一个更大元素"问题,文章还提供了对应的C++代码实现。

2025-08-16 09:08:24 283

原创 数据结构--ST表

ST表是一种基于倍增思想的稀疏表数据结构,主要用于解决可重复贡献问题的静态区间查询。其核心思想是通过动态规划预处理区间信息,将任意区间分解为两个可重叠的2的幂次区间进行处理。预处理时间复杂度为O(nlogn),空间复杂度O(nlogn),支持O(1)时间复杂度的区间查询。ST表适用于无需修改的RMQ问题,通过构建二维数组存储不同区间长度的最值信息,实现高效的区间查询。

2025-08-13 10:06:37 641

原创 P1020 导弹拦截

摘要:本文讨论了求解最长上升子序列和最长不升子序列长度的问题。通过Dilworth定理,将导弹拦截问题转化为偏序集上的最长链和最小链覆盖问题。介绍了两种解法:动态规划(O(n²))和贪心+二分(O(nlogn))。动态规划通过维护以每个元素结尾的最长序列长度来求解,而贪心算法利用二分查找优化序列维护过程。代码实现展示了两种方法的差异,适用于不同规模的数据处理需求。

2025-08-12 10:40:12 381

原创 leetcode 15 三数之和

本文介绍了在数组中查找和为指定值的三元组问题的三种解法。首先通过暴力三重循环枚举所有可能组合,时间复杂度为O(n³),并通过排序和比较去重。其次优化为二分查找法,枚举前两个数后二分查找第三个数,复杂度降至O(n²logn)。最后提出最优的双指针解法,利用排序后数组的有序性,将问题转化为两数之和问题,时间复杂度为O(n²)。三种方法都强调了去重处理的重要性,通过排序和相邻元素比较来实现高效去重。

2025-08-11 17:11:32 905

原创 Dilworth定理证明

本文摘要:文章系统介绍了偏序集的基本概念,包括链、反链、链覆盖、反链覆盖等,并重点证明了Dilworth定理和Mirsky定理。Dilworth定理表明最长反链长度等于最小链覆盖数,通过归纳法分两种情况证明;Mirsky定理作为对偶形式,证明最长链长度等于最小反链覆盖数。两个定理揭示了偏序集中链与反链的深刻对偶关系,为组合数学中偏序结构研究提供了重要工具。

2025-08-07 11:43:05 287

原创 离散数学--等价类、偏序集

本文摘要: 等价关系与划分:定义了集合上的等价关系(自反、对称、传递性),等价类的概念,并证明等价类构成集合的划分。等价关系的三个等价条件(aRb、[a]=[b]、[a]∩[b]≠∅)相互推导成立。 偏序集与格:介绍偏序关系(自反、反对称、传递)及其相关概念(全序、良序、覆盖关系)。通过哈斯图表示偏序集,讨论极大/极小元、上下界及格的判定条件(任意元素对存在最小上界和最大下界)。 拓扑排序:阐述如何从偏序关系构造兼容的全序关系,利用有限偏序集必有极小元的引理,简述拓扑排序的算法思想。

2025-08-06 15:30:47 563

原创 离散数学--二元关系及其性质、闭包

本文系统介绍了二元关系的基本概念、性质、表示方法及闭包运算。主要内容包括:1)二元关系的定义与集合表示;2)关系的6种基本性质(自反性、对称性、传递性等)及其判定方法;3)关系的矩阵表示和有向图表示;4)关系的自反闭包、对称闭包和传递闭包的概念与构造方法,重点证明了传递闭包等于连通关系,并给出了有限集上传递闭包的计算原理。文章通过严谨的数学定义和证明,结合实例说明了关系理论在离散数学中的核心地位和应用价值。

2025-08-05 17:19:13 978

原创 leetcode_11 盛最多水的容器

摘要:本文探讨了LeetCode中“盛最多水的容器”问题,给出了三种解法。暴力法枚举所有左右端点,时间复杂度O(n²)。单调数组法优化左端点枚举,但仍是O(n²)。最优解法采用双指针+贪心策略,从两端向中间移动较小高度的指针,时间复杂度O(n)。通过数学证明该策略的正确性,确保能找到最大面积。三种方法代码实现简洁,双指针法效率最高。

2025-08-04 20:12:25 1025

原创 C++ sort比较规则需要满足严格弱序

C++排序中的严格弱序规则:自定义比较函数时,必须满足非自反性(a<a为假)、传递性(a<b且b<c则a<c)和不可比传递性等严格弱序条件。常见的错误是在比较函数中未正确处理相等情况,导致违反非自反性。例如当两个默认值(fi=-1)比较时都返回true,就会引发未定义行为。解决方法是通过确保对等值情况返回false来满足严格弱序要求。

2025-08-01 11:33:03 737

原创 leetcode_560 和为K的子数组

本文探讨了和为k的子数组个数问题。提供了两种解法:1)暴力枚举法,通过固定子串起点并累加计算和,时间复杂度较高但能通过测试;2)前缀和优化法,将问题转化为类似两数之和的问题,利用哈希表存储前缀和出现次数,将时间复杂度优化至O(n)。特别强调了需要正确处理前缀和初始值pre[0]。前缀和解法通过在遍历时维护当前累加和,并查询哈希表中满足cur-k的前缀和出现次数,有效提升了算法效率。

2025-07-27 10:06:03 137

原创 leetcode_122 买卖股票的最佳时机II

本文讨论了股票买卖问题,要求通过多次买入和卖出股票获得最大利润。提供了三种解法:暴力递归、动态规划和贪心算法。暴力递归通过深度优先搜索枚举所有可能操作,但效率较低。动态规划通过状态转移方程(持有/不持有股票的最大收益)优化了时间复杂度至O(n)。最简洁的贪心算法则利用连续上升区间性质,将问题转化为相邻天数的正差价累加,时间复杂度同样为O(n)但代码更简洁。三种方法从不同角度解决了该问题,其中贪心算法最优美高效。

2025-07-25 18:07:53 982

原创 算法分析--主定理及其证明

本文介绍了递归算法分析中的主定理及其证明过程。

2025-07-24 16:16:09 336

原创 算法分析--时间复杂度

本文介绍了算法复杂度记号和问题分类。复杂度分析使用大O、Ω、Θ表示上下界和确界,小o、ω表示严格关系。P问题可在多项式时间解决;NP问题可在多项式时间验证;NPC问题是NP中最难且可互相归约的问题;NP-hard问题比NPC更广,但不一定属于NP。内容参考了矩阵客和时间复杂度相关文章。

2025-07-20 17:45:53 563

原创 leetcode_121 买卖股票的最佳时期

本文探讨了股票买卖问题的最优解法,要求在给定股价序列中通过一次买入卖出操作获得最大利润。介绍了四种解法:1)暴力枚举法(O(n²));2)贪心算法,通过维护历史最低价优化到O(n);3)动态规划法,状态转移方程与贪心类似;4)差分转换法,将问题转化为最大子数组和问题。其中贪心算法是最优解法,时间复杂度O(n),空间复杂度O(1)。后两种方法虽理论可行,但实际执行效率与贪心算法相当。

2025-07-19 21:04:31 873

原创 leetcode_53 最大子数组和

本文探讨了求解最大子数组和的四种方法:暴力枚举(O(n²))、动态规划(O(n))、贪心算法和分治策略。动态规划通过状态转移方程优化空间至O(1);贪心算法采用"抛弃负收益"策略;分治法则将问题分解为左右子区间处理,需维护区间和、左右端点极值等参数,时间复杂度为O(nlogn)。其中动态规划和贪心解法最为高效,空间复杂度均为O(1),体现了不同算法思想在解决同一问题时的多样性与优化思路。

2025-07-19 18:13:29 838

原创 华为OD 特异双端队列

摘要:题目描述了一种只能在头部弹出、但可以从两端插入的双端队列操作问题。要求通过最少次数的排序调整,使按1到n的顺序依次弹出元素。初始解法直接排序队列,优化后利用插入的有序性,通过维护队列的最小期望值和当前最大插入值来判断是否需要排序。最终解法进一步简化,仅用三个变量(期望值、最大插入值、是否有序)来跟踪队列状态,无需实际维护队列内容,显著优化了空间复杂度。

2025-07-15 17:21:46 438

原创 leetcode_20 有效的括号

本文介绍了判断括号序列有效性的算法。关键在于利用栈结构匹配括号对,并通过哈希表优化判断逻辑。文章提出两种解法:栈存储左括号本身或对应的右括号,处理时先检查字符串长度是否为偶数,再遍历匹配括号。两种方法均需确保栈最终为空,否则序列无效。参考来源提供了详细思路。

2025-07-15 08:51:16 319

原创 华为OD 消消乐游戏

摘要:本文讨论了一个字符串消除游戏的算法实现。游戏规则是相邻相同字母可消除,直到无法消除为止。文章比较了两种解法:栈的应用和双指针法。栈解法通过比较栈顶元素与当前元素实现高效消除,而双指针法需处理重复消除问题。样例分析表明栈解法更简洁高效,最终只需输出剩余字符串长度。

2025-07-14 17:39:12 715

原创 华为OD 处理器

本文实现了一个处理器亲和性调度算法,根据任务需求数量和可用处理器编号输出符合优先级的处理器组合。 算法首先将处理器分为两组(0-3和4-7),然后根据任务申请数量num(1/2/4/8)确定优先级规则: num=1时优先级顺序:剩余4个>2个>3个>1个 num=2时优先级顺序:剩余2个>4个>3个 num=4时必须剩余4个 num=8时需要全部8个处理器可用 使用回溯法生成满足条件的处理器组合,对两组处理器分别计算优先级,输出优先级高的组合。若优先级相同,则输出两组中的所有可

2025-07-13 23:36:48 553

原创 CS144 lab2 tcp_receiver

本文摘要: 实验实现了TCP接收端功能,重点解决32位序列号与64位绝对序列号的转换问题。实验包含两部分:接收并重组数据流(Reassembler),以及发送确认号和窗口大小(ackno和window size)。主要挑战在于处理32位序列号空间的回绕(wrap around)问题,以及SYN/FIN标志对序列号的影响。通过建立绝对序列号、流索引和TCP序列号之间的转换关系,解决了索引空间差异问题。实验还处理了TCP连接建立和终止时的序列号管理,以及窗口大小限制等细节。最终实现了能够正确处理数据重组和反馈确

2025-07-11 16:31:52 846

原创 leetcode 226 翻转二叉树

题目要求翻转一棵二叉树并返回根节点。通过递归方法实现:先翻转二叉树的左右子树,再将左右子树交换位置。对于空节点直接返回,否则递归处理左右子树后交换它们的引用。该解法简洁高效,时间复杂度为O(n),空间复杂度为O(h),其中n是节点数,h是树的高度。

2025-07-10 10:17:44 229

原创 leetcode_27 移除元素

本文介绍了两种双指针解法来移除数组中指定值val的元素。第一种同向双指针法使用快慢指针,将非val元素前移,时间复杂度O(n)。第二种相向双指针法通过左右指针交换元素,避免了重复赋值问题。两种方法都不需要额外空间,原地修改数组并返回新长度。代码示例展示了两种解法的具体实现,适用于需要在原数组上高效处理元素移除的场景。

2025-07-10 10:00:42 311

原创 华为OD 数字游戏

题目要求判断是否存在连续子数组的和能整除给定整数m。两种主要解法:动态规划和前缀和结合哈希表。动态规划解法时间复杂度为O(nm),空间复杂度可优化至O(m)。前缀和结合哈希表利用同余性质将问题转化为寻找相同模值,时间复杂度降至O(n),空间复杂度为O(m)。最优解法采用前缀和与哈希表,效率更高,适用于大规模数据。

2025-07-08 16:41:34 779

原创 C++17: string_view

c++17: string_view

2025-07-08 10:42:53 236

原创 C++17:std::optional

C++17: std::optional

2025-07-08 10:08:51 126

原创 华为OD 二叉树的中序遍历

华为OD 二叉树的中序遍历

2025-07-08 09:27:16 269

空空如也

模板实现bitset

2023-04-27

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

TA关注的人

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