- 博客(445)
- 收藏
- 关注

原创 从Intel开发手册看x86指令格式(含手动将指令转化为机器码的方法)
Instruction Prefixes为指令前缀,Opcode为操作码,Displacement为偏移,Immediate为立即数注:ModR/M和SIB在本文后面会详细介绍(摘自卷2:Intel 64 and IA-32 Architectures Instruction Format)
2025-03-24 09:50:52
786

原创 【x86汇编】C语言的switch&case结构的反汇编分析
push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。
2024-10-29 19:57:40
1631
原创 CD46.【C++ Dev】list的模拟实现(1)
介绍C++ STL库中list容器的模拟实现部分过程。首先分析了STL库中list的双向链表结构,包括节点结构体和空链表构造函数的实现。接着展示了自定义list类的框架搭建,重点讲解了哨兵位节点的构造和尾插操作的实现。文章着重探讨了list迭代器的设计,解释了迭代器作为封装类的必要性,详细说明了迭代器的构造函数、++/--运算符重载、解引用操作符以及比较运算符的实现方法。最后讨论了const迭代器的设计考量,指出需要区分迭代器本身的可修改性和迭代内容的可修改性。
2025-07-08 11:14:30
620
原创 126.【C语言】数据结构之归并排序非递归解法
介绍归并排序的非递归实现方法。首先回顾了递归解法,然后重点讲解了循环实现非递归归并排序的两种方案。针对数组元素个数为2的次方倍的情况,详细分析了gap控制分组归并的机制,给出了完整的代码框架。对于元素个数非2次方倍的情况,提出了两种处理边界越界的方法:一是归并完成后统一拷贝,二是边归并边拷贝。通过调试信息展示了分组归并的过程,并通过LeetCode测试验证了算法的正确性。最终推荐使用边归并边拷贝的方法,因其处理边界条件更简单高效。
2025-07-07 11:03:57
298
原创 125.【C语言】数据结构之归并排序递归解法
绍了归并排序递归算法的实现过程。首先通过重新排列数组的题目引出分治思想,然后详细讲解了归并排序的分治策略:将数组不断二分直到单个元素视为有序,再通过合并有序子序列完成排序。文章提供了完整的递归实现代码,包括临时数组的使用、区间划分和归并操作,并分析了时间复杂度为O(NlogN)。最后指出该算法对奇数个元素同样适用,并通过LeetCode测试验证了正确性,为后续讲解非递归实现做铺垫。
2025-07-06 19:19:28
1064
原创 130.【C语言】数据结构之基数排序(了解即可,实际应用较少)
基数排序是一种非比较类排序算法,通过分配和回收的方式对数字的每一位进行排序。首先解释了基数排序的基本原理,包括最低位优先法和最高位优先法,并通过一个具体的例子展示了基数排序的过程。接着分析了基数排序的时间复杂度,并给出了C++实现代码。最后提出了一个思考题:如何对包含负数的数组进行基数排序,并给出了相应的解决方案
2025-07-05 20:59:20
674
原创 CC56.【C++ Cont】分治算法:快排的简要复习(含手撕快排题)
分治算法基本思想及其在快速排序中的应用。重点复习了优化后的Hoare快速排序算法,包含随机选key和三路划分的实现方法。通过"颜色分类"和"排序数组"两个例题,展示了如何运用三路划分思想进行数组排序。代码实现采用递归方式,对小于和大于key的区间分别递归处理,最终完成整个数组的升序排列。该算法时间复杂度为O(nlogn),空间复杂度较优,适用于大规模数据排序。
2025-07-04 20:46:22
1032
原创 L58.【LeetCode题解】模拟算法习题集1(Z 字形变换、外观数列)
Z字形变换采用两种解法:方法1通过二维数组模拟Z字形填充过程,分竖填和斜填两步完成;方法2优化为找规律解法,通过分析行间字符间隔规律直接计算位置。两种方法均需特殊处理numRows=1的情况,时间复杂度均为O(n)。 外观数列问题提供三种解法:方法1通过迭代生成数列;改进版仅保留当前结果节省空间;双指针法优化计数过程。另有打表法利用n≤30的特性,预生成结果直接查询。核心都是对前一项进行行程长度编码,典型解法时间复杂度为O(n*m),其中m为字符串平均长度。
2025-07-04 15:03:44
616
原创 OS15.【Linux】gdb调试器的简单使用
介绍了Linux下GDB调试器的使用方法。主要内容包括:调试前的准备工作,需使用-g选项编译生成debug版本;断点的分类与原理,分为软件断点和硬件断点;通过示例代码演示了常用调试命令的使用,如list查看代码、break设置断点、run运行程序、info查看信息、next/step单步调试、print查看变量等。文章还对比了GDB命令与Visual Studio调试功能的对应关系,并介绍了finish、continue、setvar等进阶命令的使用方法。
2025-07-03 20:22:08
642
原创 OS14.【Linux】git的简单使用
介绍了Git的基本概念和使用方法。Git是一个免费开源的分布式版本控制系统,由Linus Torvalds开发。文章讲解了如何创建Git仓库,安装Git,使用git clone克隆仓库,配置用户信息。重点介绍了常用命令:git add提交文件变更到暂存区,git commit记录本地修改,git push推送更改到远端仓库,以及git log查看提交历史和git status检查仓库状态。最后解释了.gitignore文件的作用,通过实例验证了其对特定类型文件的忽略效果,如.app后缀文件不会被上
2025-07-02 19:13:00
588
1
原创 OSE3.【Linux】练习:编写进度条及pv命令项目中的进度条函数
本文介绍了Linux下进度条的实现方法,重点讲解了C语言中回车换行、缓冲区、sleep/usleep函数的使用技巧。通过倒计时程序作为预备实验,逐步构建了5个版本的进度条:从基础版本到添加中括号、百分比、旋转动画等特效。文章还分析了pv命令项目中进度条显示函数的调用方式,并提供了模拟下载过程的回调函数实现。最后讲解了如何生成2GB测试文件并使用pv命令监控复制进度。代码示例和效果演示完整展现了Linux环境下进度条的开发流程和优化思路。
2025-07-01 18:54:28
728
原创 L57.【LeetCode题解】位运算习题集2(只出现一次的数字 II、消失的两个数字)
解决数组中数字出现次数问题的两种方法:哈希表法和位运算。针对"只出现一次的数字II"问题,哈希表法统计元素出现次数,位运算法则通过按位统计和模3运算找到唯一数字。对于"消失的两个数字"问题,方法1使用数组标记出现数字,方法2则运用位运算技巧,将问题转化为寻找两个只出现一次的数字。位运算方法在保证线性时间复杂度的同时,有效节省了空间复杂度,是更优的解决方案。文章还提供了详细的代码实现和复杂度分析。
2025-06-30 10:15:52
714
原创 L56.【LeetCode题解】位运算习题集1(只出现一次的数字 III、判定字符是否唯一、两整数之和)
【摘要】文章分析了两个算法问题:1)在给定数组中找出仅出现一次的两个数字,通过位运算分组异或实现线性时间复杂度;2)判断字符串字符是否唯一,提出基于数组计数和位掩码两种解法。重点解析了位运算在[只出现一次的数字III]中的应用,包括异或性质、lowbit提取和最右侧1的分组原理,同时对比了字符串查重问题的不同实现方式,强调了算法优化的空间复杂度考量。
2025-06-28 20:43:00
860
原创 CC55.【C++ Cont】位运算的最终总结(含比特位计数、汉明距离)
回顾了位运算优先级、位操作(判断、修改、提取等)的核心方法,重点介绍了位图思想和异或运算定律。随后通过LeetCode题目"比特位计数"展示了三种解法:暴力循环32位法(O(nlogn))、奇偶规律优化法(O(n))以及快速统计法(利用n&(n-1))。最后以"汉明距离"为例,演示如何通过异或和位操作高效解决问题。全文强调位运算的低层级优化思维,为算法性能提升提供有效途径。
2025-06-26 10:09:59
612
原创 OS13.【Linux】项目的自动化构建工具:makefile
介绍Linux下使用make和makefile编译大型项目的方法。首先以Redis为例演示了简单的make编译流程,然后详细讲解了makefile的基本语法,包括依赖关系、依赖方法和清理规则的编写。文章还探讨了make的自动化推导机制、时间判断原理,以及.PHONY伪目标和简写符号的使用。最后介绍了如何通过修改文件时间或使用.PHONY修饰来强制重新编译,以及用@符号隐藏命令执行细节的技巧。
2025-06-24 16:22:34
889
原创 CD45.【C++ Dev】STL库的list的使用和迭代器的分类
介绍C++中list容器的使用方法与特性。主要内容包括:1.list底层为双向链表结构,支持高效插入、删除操作;2.不同构造方式(空构造、初始化、拷贝构造)及头插尾插操作;3.迭代器注意事项(不支持随机访问,存在失效问题);4.专用函数(排序、归并、去重、链表转移);5.迭代器分类(正向、双向、随机访问等)。特别指出vector排序效率高于list,并通过代码示例验证。最后简要说明5种迭代器类型及其特点。
2025-06-19 18:52:24
1057
原创 求解无向图的最小哈密尔顿回路
本文通过多叉树遍历算法求解离散数学中的哈密尔顿回路问题。针对a-e五个节点的完全无向图,采用DFS深度优先搜索递归生成所有可能的24种回路(5!排列)。算法使用set记录已访问节点避免重复,并用multimap存储路径长度和对应回路。最终输出最短路径方案(长度19):如a→b→c→d→e→a及其对称路径。该方法避免了人工枚举,高效实现了哈密尔顿回路的系统搜索与优化。
2025-06-16 19:35:41
343
原创 CD44.【C++ Dev】vector模拟实现(3)
vector模拟实现中的几个关键问题:1. erase迭代器失效问题及正确实现方法,指出erase后原迭代器可能失效;2. pop_back的实现方式及注意事项;3. resize函数处理内置与自定义类型的差异;4. 解决深拷贝问题,特别是自定义类型元素时的内存管理;5. 补充了fill和range两种构造函数实现;6. 分析了STL源码中构造函数的有趣设计。通过测试用例验证了各功能的正确性,并针对不同类型元素(内置/自定义)的处理提出了解决方案。文章还讨论了如何避免模板匹配冲突,以及使用ex
2025-06-14 15:03:44
631
原创 OS12.【Linux】gcc和g++以及动静态链接
讲解了GCC的使用,包括gcc与g++的区别、编译过程的四个阶段(预处理-E、编译-S、汇编-c、链接)。重点介绍了编译器选项(-std、-O、-Wall/-Werror、-g)的使用场景,动态库(.so)与静态库(.a)的差异及ldd/file命令的用法。通过实例演示了从源代码到可执行文件的完整编译流程,分析了动静态链接的优缺点:动态库节省资源但依赖系统环境,静态库独立性强但体积较大。文中还涵盖了宏定义(-D)、调试信息(-g)
2025-06-10 19:52:44
1003
原创 OS11.【Linux】vim文本编辑器
Vim是一款多模式文本编辑器,包含命令模式、插入模式和底行模式三种主要模式。命令模式下可使用gg/G移动光标、yy/dd复制删除行、u撤销等高效操作;插入模式用于文本输入;底行模式用于保存退出(:wq)和执行外部命令(:!gcc)。 Vim支持分屏操作(vs文件),可同时编辑多个文件(ctrl+ww切换)。配置通过修改用户家目录的.vimrc文件实现,推荐使用一键配置脚本。NeoVim作为改进分支,兼容Vim并提供更多功能。文中还介绍了微软Edit编辑器作为替代选择。
2025-06-06 14:39:02
881
原创 CD43.【C++ Dev】vector模拟实现(2)
vector类实现中的三个关键问题:1. 拷贝构造函数的深拷贝实现,包括两种写法及调试过程中发现的问题与解决方案;2. operator[]运算符重载的实现,特别强调了对const和非const版本的区分;3. insert操作中的迭代器失效问题及其解决方法。文章通过具体代码示例和调试分析,详细说明了扩容时迭代器失效的原因,并给出了STL标准解决方案——返回更新后的迭代器位置。测试代码验证了各功能的正确性,为vector模拟实现提供了重要参考。
2025-06-04 15:40:25
945
原创 OS10.【Linux】yum命令
Linux系统中的软件安装方法,重点讲解了yum包管理器的使用。主要内容包括: 软件安装方法: 直接编译源代码(较复杂) 使用yum等包管理器(推荐) yum常用命令: yum list:查看软件包 yum install/remove:安装/卸载软件 其他命令:yum search/makecache/update/upgrade 扩展yum源: 安装epel-release扩展源 通过扩展源安装sl小火车等软件 yum源管理: 配置文件位置:/etc/yum.re
2025-06-01 17:22:42
988
原创 L56.【LeetCode题解】 电话号码的字母组合
LeetCode电话号码字母组合问题的递归解法。给定数字字符串(2-9),需返回所有可能的字母组合。采用DFS递归算法:建立数字-字母映射表,递归函数通过level参数跟踪当前处理位置,当level等于输入长度时保存当前组合。处理特殊情况(空输入)直接返回空结果。以"258"为例,展示了递归调用的展开过程,最终得到3×3×3=27种组合。代码实现中注意字符串传值而非引用,确保递归回溯时正确性。时间复杂度为O(3^N ×4^M),其中N/M对应3/4字母的数字个数。
2025-05-31 21:59:33
972
原创 OS9.【Linux】基本权限(下)
Linux系统通过umask掩码(如002)计算文件/目录的默认权限(664/775),规则为"原始权限&(~umask)"。对目录权限的实验表明:x权限决定能否进入目录,r权限决定能否查看内容,w权限决定能否修改内容。共享目录通常设置在/tmp下并设置粘滞位(t),这样只有文件所有者和root能删除文件,解决了多用户共享时的权限问题。普通用户家目录(700)默认互不可访问
2025-05-30 15:15:17
1178
原创 OS8.【Linux】基本权限(上)
介绍了Linux系统中的权限管理机制。首先讲解了指令运行原理和Shell作用,随后详细阐述了用户权限分类(root/普通用户)及切换方式(su/su-/sudo)。重点剖析了文件权限系统,包括文件类型标识(-/d/b/c/p)、三种角色(拥有者/所属组/其他人)和权限类型(r/w/x),并通过实例演示权限查看方法。最后讲解了权限修改命令:chmod(+/-权限)、chown(修改拥有者)、chgrp(修改所属组),特别强调权限认证的优先级规则
2025-05-29 08:18:33
1117
原创 CD42.【C++ Dev】vector模拟实现(1)
基于SGISTL的vector模拟实现过程,主要包括框架搭建和核心功能实现。文章首先回顾了vector相关知识,对比了SGISTL中vector的结构设计,重点分析了start、finish、end_of_storage三个关键迭代器成员的作用。接着详细讲解了构造函数、capacity/size计算、迭代器获取、reserve扩容、push_back插入等核心功能的实现方法,特别处理了空vector和扩容两种情况。通过内置类型int和自定义类型string的测试用例验证了实现的正确性
2025-05-28 16:01:29
678
原创 CD41.【C++ Dev】补充vector细碎的知识点
补充C++中vector知识点:1. vector初始化方式,包括使用迭代器范围和数组指针;2. 对比vector<char>与string,说明string的专业性;3. sort函数的升序/降序排序方法,演示反向迭代器和greater的用法;4. 强调reserve与resize的区别;5. 介绍data()成员函数访问底层数组;6. 二维vector的两种访问方式,包括operator[]重载和data()指针操作
2025-05-26 09:54:35
828
原创 L54.【LeetCode题解】前缀和习题集1(寻找数组的中心下标,除自身以外数组的乘积,和为K的子数组)
两种使用前缀和/积与后缀和/积解决数组问题的算法。首先通过724题展示了寻找数组中心下标的方法,定义了前缀和数组dp[i]和后缀和数组g[i],通过比较两者来定位中心下标。接着在238题中,将概念扩展到乘积运算,构建前缀积数组f[i]和后缀积数组g[i],最终通过两者相乘得到除自身外的数组乘积。文章提供了两种代码实现方式,并强调了初始化条件和状态转移方程的重要性。这些方法都能在O(n)时间复杂度内高效解决问题,体现了前缀和/积技巧在数组处理中的实用性。
2025-05-24 20:36:46
860
原创 CC53.【C++ Cont】一维前缀和
介绍前缀和的概念及其在算法中的应用。前缀和是一种通过预处理数组来快速计算任意区间和的技术,能够显著优化时间复杂度。文章通过例题“一维前缀和”展示了暴力解法和前缀和解法的对比,指出前缀和解法通过预处理数组和递推公式,降低时间复杂度,还以“最大子段和”问题为例,展示了如何利用前缀和优化算法,通过改进方法1的两层循环,进一步降低时间复杂度。
2025-05-22 18:50:50
1116
原创 L53.【LeetCode题解】二分法习题集2
本文主要讨论了三个算法问题的分析与解决:寻找峰值、寻找旋转排序数组中的最小值以及点名问题。对于寻找峰值问题,通过二分法利用数组的二段性,时间复杂度为O(logn)。寻找旋转排序数组中的最小值问题,通过分析数组的增长趋势,设计二分法找到最小值,时间复杂度同样为O(logn)。点名问题则通过二分法查找缺失的学号,时间复杂度为O(logn)。每个问题都提供了详细的代码实现和提交结果,展示了如何通过二分法高效解决这些问题。
2025-05-21 21:35:12
704
原创 CD40.【C++ Dev】string类的模拟实现(4)(operator=、拷贝构造函数的现代写法、写时拷贝的简单了解)
本文探讨了C++中operator=和拷贝构造函数的现代写法,并分析了错误写法的原因。传统operator=写法涉及深拷贝,现代写法则通过临时对象和swap函数实现更简洁的代码。错误写法会导致死循环调用,引发栈溢出。拷贝构造函数的现代写法通过初始化临时对象并交换成员变量来避免野指针问题。此外,文章还介绍了写时拷贝(Copy-On-Write)技术,该技术通过延迟内存分配来优化内存使用,并在需要修改时才创建副本。测试代码展示了这些写法的实际效果。
2025-05-20 08:40:49
936
原创 CD39.【C++ Dev】string类的模拟实现(3)
本文主要讨论了C++中字符串操作的实现,包括resize、operator<<、operator>>以及字符串比较操作符的实现。首先,resize函数用于调整字符串大小,并根据新大小进行填充或截断。其次,operator<<用于输出字符串,必须引用返回以避免拷贝。接着,operator>>用于从输入流中读取字符串,通过缓冲数组优化了性能。最后,详细讨论了字符串比较操作符(如<、>=、==等)的实现,通过memcmp和自定义逻辑确保比较的准确性。文章
2025-05-18 09:29:32
862
原创 CE17.【C++ Cont】练习题组17(堆专题)
h(x)=x^2+7x+1,编号为3;先将{12,1,1}、{12,2,1}、{9,3,1}入堆,发现函数值9最小,因此删除堆顶元素后将{h(1+1),3,2}入堆,以此类推......序列",应尽量减少循环次数,观察发现,设外循环为变量i,内循环为变量j,当i不变时,随着j的增大a[i]+b[j]的值也在增大或者不变,当a[i]+b[j]在增大时,先将a[i]+b[0]入堆(堆中元素正好N个),之后每次先出堆顶元素,再入剩下的元素(a[i]+b[1]、a[i]+b[2]、...、a[i]+b[n]),
2025-05-17 18:03:15
672
原创 L52.【LeetCode题解】二分法习题集1
回顾二分查找的基本模板,详细分析了LCR072.x的平方根、搜索插入位置和LCR069.山脉数组的峰顶索引
2025-05-16 14:15:11
620
原创 CC52.【C++ Cont】二分查找的左、右边界模版
本文详细介绍了如何在有序数组中查找目标值的起始和结束位置,重点讲解了二分查找的优化方法。通过分析数组的二段性,文章提出了改进的二分查找模版,分别用于查找左边界和右边界。查找左边界时,通过调整循环条件和更新策略,确保算法在O(log n)时间复杂度内完成;查找右边界时,采用类似的思路,但需注意更新mid的公式以避免死循环。文章还提供了具体的代码实现,并强调了细节处理的重要性,如循环条件的设置和mid的更新方式。最后,总结了查找左边界和右边界的万能模版,便于读者在实际应用中快速套用。
2025-05-15 15:14:05
875
原创 CD38.【C++ Dev】string类的模拟实现(2)
本文详细介绍了C++中string类的模拟实现,重点讲解了append、operator+=、insert、erase、find和substr等常用成员函数的实现方法。文章通过代码示例和测试代码,展示了如何实现字符串的追加、插入、删除、查找和子串提取等功能。每个函数的实现都考虑了边界条件和内存管理,确保代码的健壮性和效率。例如,append函数在追加字符串前会检查是否需要扩容,insert函数在插入字符时会移动数据以避免覆盖,erase函数则根据参数的不同情况删除指定范围的字符。通过这些实现,读者可以深入理
2025-05-14 14:09:03
1104
原创 L51.【LeetCode题解】LCR 072. x 的平方根 (6种方法)
计算非负整数平方根的多种方法,重点分析了卡马克逆平方根算法和牛顿迭代法的实现。此外,还介绍了循环枚举和内联汇编的方法,分别通过逐一尝试和直接调用硬件指令来实现平方根计算。
2025-05-13 09:17:42
1126
原创 CC51.【C++ Cont】二分查找的普通模版
本文回顾了二分查找算法,并提炼了其关键点。二分查找不仅适用于有序数组,还可用于满足特定规律的数组。文章以LeetCode 704题为例,详细分析了二分查找的实现过程,强调其核心思想是“分两段,舍一段,操作另一段”。通过代码示例展示了如何通过二分法高效查找目标值,并提供了防止整数溢出的方法。此外,文章还提到三分法、四分法及随机数分段的应用,总结了二分查找的通用模板及注意事项,如判断条件、mid的防溢出处理以及left和right的更新方式。
2025-05-12 10:09:35
852
原创 L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)
1.题目2.分析暴力解法方法1:排序(超时)方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握)能相等的前提:两个哈希表的大小相等哈希表有迭代器,可以使用范围for从头到尾遍历提交结果优化方法:定长滑动窗口提交结果使用哈希数组更快提交结果★★★更优化的方法:不定长滑动窗口(比定长的要快!)提交结果
2025-05-11 15:41:31
1068
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人