自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 从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 745

原创 【x86汇编】C语言的switch&case结构的反汇编分析

push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。

2024-10-29 19:57:40 1619

原创 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 618

原创 OS11.【Linux】vim文本编辑器

介绍Vim文本编辑器的基本使用和配置方法。主要内容包括:1) Vim的三种常用模式(命令模式、插入模式和底行模式)及其转换关系;2) 常用命令操作如移动光标、复制粘贴等;3) 分屏多文件操作方法;4) 通过修改.vimrc文件配置Vim的原理;5) 提供CentOS一键配置脚本和NeoVim(Vim改进版)的推荐资源。文章还给出了Vim官网和相关配置项目的链接,适合初学者快速掌握Vim的基本使用和个性化配置。

2025-06-06 14:39:02 851

原创 CD43.vector模拟实现(2)

vector类实现中的三个关键问题:1. 拷贝构造函数的深拷贝实现,包括两种写法及调试过程中发现的问题与解决方案;2. operator[]运算符重载的实现,特别强调了对const和非const版本的区分;3. insert操作中的迭代器失效问题及其解决方法。文章通过具体代码示例和调试分析,详细说明了扩容时迭代器失效的原因,并给出了STL标准解决方案——返回更新后的迭代器位置。测试代码验证了各功能的正确性,为vector模拟实现提供了重要参考。

2025-06-04 15:40:25 922

原创 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 971

原创 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 946

原创 OS9.【Linux】基本权限(下)

Linux系统通过umask掩码(如002)计算文件/目录的默认权限(664/775),规则为"原始权限&(~umask)"。对目录权限的实验表明:x权限决定能否进入目录,r权限决定能否查看内容,w权限决定能否修改内容。共享目录通常设置在/tmp下并设置粘滞位(t),这样只有文件所有者和root能删除文件,解决了多用户共享时的权限问题。普通用户家目录(700)默认互不可访问

2025-05-30 15:15:17 1175

原创 OS8.【Linux】基本权限(上)

介绍了Linux系统中的权限管理机制。首先讲解了指令运行原理和Shell作用,随后详细阐述了用户权限分类(root/普通用户)及切换方式(su/su-/sudo)。重点剖析了文件权限系统,包括文件类型标识(-/d/b/c/p)、三种角色(拥有者/所属组/其他人)和权限类型(r/w/x),并通过实例演示权限查看方法。最后讲解了权限修改命令:chmod(+/-权限)、chown(修改拥有者)、chgrp(修改所属组),特别强调权限认证的优先级规则

2025-05-29 08:18:33 1109

原创 CD42.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 667

原创 CD41.补充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 815

原创 L54.【LeetCode题解】前缀和习题集1

两种使用前缀和/积与后缀和/积解决数组问题的算法。首先通过724题展示了寻找数组中心下标的方法,定义了前缀和数组dp[i]和后缀和数组g[i],通过比较两者来定位中心下标。接着在238题中,将概念扩展到乘积运算,构建前缀积数组f[i]和后缀积数组g[i],最终通过两者相乘得到除自身外的数组乘积。文章提供了两种代码实现方式,并强调了初始化条件和状态转移方程的重要性。这些方法都能在O(n)时间复杂度内高效解决问题,体现了前缀和/积技巧在数组处理中的实用性。

2025-05-24 20:36:46 851

原创 CC53.【C++ Cont】一维前缀和

介绍前缀和的概念及其在算法中的应用。前缀和是一种通过预处理数组来快速计算任意区间和的技术,能够显著优化时间复杂度。文章通过例题“一维前缀和”展示了暴力解法和前缀和解法的对比,指出前缀和解法通过预处理数组和递推公式,降低时间复杂度,还以“最大子段和”问题为例,展示了如何利用前缀和优化算法,通过改进方法1的两层循环,进一步降低时间复杂度。

2025-05-22 18:50:50 1108

原创 L53.【LeetCode题解】二分法习题集2

本文主要讨论了三个算法问题的分析与解决:寻找峰值、寻找旋转排序数组中的最小值以及点名问题。对于寻找峰值问题,通过二分法利用数组的二段性,时间复杂度为O(logn)。寻找旋转排序数组中的最小值问题,通过分析数组的增长趋势,设计二分法找到最小值,时间复杂度同样为O(logn)。点名问题则通过二分法查找缺失的学号,时间复杂度为O(logn)。每个问题都提供了详细的代码实现和提交结果,展示了如何通过二分法高效解决这些问题。

2025-05-21 21:35:12 698

原创 CD40.【C++ Dev】string类的模拟实现(4)

本文探讨了C++中operator=和拷贝构造函数的现代写法,并分析了错误写法的原因。传统operator=写法涉及深拷贝,现代写法则通过临时对象和swap函数实现更简洁的代码。错误写法会导致死循环调用,引发栈溢出。拷贝构造函数的现代写法通过初始化临时对象并交换成员变量来避免野指针问题。此外,文章还介绍了写时拷贝(Copy-On-Write)技术,该技术通过延迟内存分配来优化内存使用,并在需要修改时才创建副本。测试代码展示了这些写法的实际效果。

2025-05-20 08:40:49 923

原创 CD39.【C++ Dev】string类的模拟实现(3)

本文主要讨论了C++中字符串操作的实现,包括resize、operator<<、operator>>以及字符串比较操作符的实现。首先,resize函数用于调整字符串大小,并根据新大小进行填充或截断。其次,operator<<用于输出字符串,必须引用返回以避免拷贝。接着,operator>>用于从输入流中读取字符串,通过缓冲数组优化了性能。最后,详细讨论了字符串比较操作符(如<、>=、==等)的实现,通过memcmp和自定义逻辑确保比较的准确性。文章

2025-05-18 09:29:32 848

原创 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 665

原创 L52.【LeetCode题解】二分法习题集1

回顾二分查找的基本模板,详细分析了LCR072.x的平方根、搜索插入位置和LCR069.山脉数组的峰顶索引

2025-05-16 14:15:11 612

原创 CC52.【C++ Cont】二分查找的左、右边界模版

本文详细介绍了如何在有序数组中查找目标值的起始和结束位置,重点讲解了二分查找的优化方法。通过分析数组的二段性,文章提出了改进的二分查找模版,分别用于查找左边界和右边界。查找左边界时,通过调整循环条件和更新策略,确保算法在O(log n)时间复杂度内完成;查找右边界时,采用类似的思路,但需注意更新mid的公式以避免死循环。文章还提供了具体的代码实现,并强调了细节处理的重要性,如循环条件的设置和mid的更新方式。最后,总结了查找左边界和右边界的万能模版,便于读者在实际应用中快速套用。

2025-05-15 15:14:05 864

原创 CD38.【C++ Dev】string类的模拟实现(2)

本文详细介绍了C++中string类的模拟实现,重点讲解了append、operator+=、insert、erase、find和substr等常用成员函数的实现方法。文章通过代码示例和测试代码,展示了如何实现字符串的追加、插入、删除、查找和子串提取等功能。每个函数的实现都考虑了边界条件和内存管理,确保代码的健壮性和效率。例如,append函数在追加字符串前会检查是否需要扩容,insert函数在插入字符时会移动数据以避免覆盖,erase函数则根据参数的不同情况删除指定范围的字符。通过这些实现,读者可以深入理

2025-05-14 14:09:03 1091

原创 L51.【LeetCode题解】LCR 072. x 的平方根 (6种方法)

计算非负整数平方根的多种方法,重点分析了卡马克逆平方根算法和牛顿迭代法的实现。此外,还介绍了循环枚举和内联汇编的方法,分别通过逐一尝试和直接调用硬件指令来实现平方根计算。

2025-05-13 09:17:42 1120

原创 CC51.【C++ Cont】二分查找的普通模版

本文回顾了二分查找算法,并提炼了其关键点。二分查找不仅适用于有序数组,还可用于满足特定规律的数组。文章以LeetCode 704题为例,详细分析了二分查找的实现过程,强调其核心思想是“分两段,舍一段,操作另一段”。通过代码示例展示了如何通过二分法高效查找目标值,并提供了防止整数溢出的方法。此外,文章还提到三分法、四分法及随机数分段的应用,总结了二分查找的通用模板及注意事项,如判断条件、mid的防溢出处理以及left和right的更新方式。

2025-05-12 10:09:35 837

原创 L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)

1.题目2.分析暴力解法方法1:排序(超时)方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握)能相等的前提:两个哈希表的大小相等哈希表有迭代器,可以使用范围for从头到尾遍历提交结果优化方法:定长滑动窗口提交结果使用哈希数组更快提交结果★★★更优化的方法:不定长滑动窗口(比定长的要快!)提交结果

2025-05-11 15:41:31 1040

原创 CD37.【C++ Dev】string类的模拟实现(1)

1.string基本知识的回顾2.简单的模拟实现准备操作代码实现成员变量构造函数C风格构造的函数无参构造函数C风格构造的函数与无参构造函数合二为一析构函数c_str()size()operator[ ]可读可写只可读iterator(指针版)begin()和end()push_back(char c)

2025-05-10 08:40:52 684

原创 L48.【LeetCode题解】904. 水果成篮

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组fruits表示,其中fruits[i]是第i棵树上的水果。你想要尽可能多地收集水果。给你一个整数数组fruits,返回你可以收集的水果的数目。fruits = [3可以采摘全部 3 棵树。3可以采摘 [1,2,2] 这三棵树。如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。4可以采摘 [2,3,2,2] 这四棵树。如果从第一棵树开始采摘,则只能采摘 [1,2] 这两棵树。,3,3,4]5。

2025-05-09 19:28:23 1298

原创 L47.【LeetCode题解】1658. 将 x 减到 0 的最小操作数

循环变量为right,每循环一次就sum+=nums[right],如果sum>target,那么left右移,直到sum<=target停止右移,如果满足sum==target,执行len=max(len,right-left+1)即可,right到nums.size()-1时停止循环。3+2+1+1+3==10,移除红色区域的元素即可,红色区域一共5个数,绿色区域的元素被保留。最佳解决方案是移除后三个元素和前两个元素(总共 5 次操作),将 x 减到 0。",红色区域的元素个数要最小,则。

2025-05-08 08:42:37 777

原创 CD36.【C++ Dev】STL库的string的使用 (下)

​优点:写reserve后,插入少量字符时后面不需要扩容,避免异地扩容消耗时间有可能reserve的参数大小比原字符串的大小要小,但有字符串的情况下reserve不会缩容,且不会改变size[点击并拖拽以移动]如果没有字符串的情况下(即空串),可能会缩容,也可能什么都不做,具体和STL的实现有关(因为没有规定要缩容,而且缩容是释放原空间,开辟新的小空间,用时间换空间,代价较大,因此不建议使用与缩容有关的函数)如果reserve()比capacity小,不HJ1 字符串最后一个单词的长度。

2025-05-07 14:19:51 1104

原创 OS7.【Linux】基本指令入门(6)

可以看文件的后缀名:.zip、.gz 、 .bz2、.xz、.tar、.tar.gz.、tar.bz2、.tar.xz ......可以看出:上方文件的后缀名的打包和压缩方案都不同.下面重点介绍tar打包方案由于tar命令下的选项十分多,这里将两个组合选项。

2025-05-06 09:30:05 950

原创 OSE2.【Linux】练习:查找项目的main函数入口

登录后,在gitee主界面的右上角选择:从GitHub/GitLab导入仓库。如果显示已经有镜像仓库可以直接访问镜像网站。,在Linux下查找其main函数入口。首先切换到root用户下安装git指令。使用ls -l查看是否成功clone。grep指令的复习参见文章。等待clone完成即可。之后复制代码到终端运行。

2025-05-05 10:14:14 483

原创 L46.【LeetCode题解】1004. 最大连续1的个数 III

zero>k,需要出窗口,即left++,(left++之前,如果nums[left]为1,不变动zero;1.初始化窗口的两个端点:left=0,right=0,zero=0(zero为存储滑动窗口中0的个数)m时,讨论m个0翻转1个、翻转2个、...、翻转k个的情况,针对每个情况求连续1的最大个数。m时,讨论m个0翻转1个、翻转2个、...、翻转m个的情况,针对每个情况求连续1的最大个数。以[1,1,1,0,0,0,1,1,1,1,1],k==2为例。转化思路:设区间[left,right],

2025-05-04 15:19:25 931

原创 CD35.【C++ Dev】STL库的string的使用 (中)

下断点到return 0,查看监视窗口begin和end的值,发现end里面的ptr指向的是"helloworld"字符串结尾的\0。clear()使size()清零,但没有改变capacity(),这是因为避免可能再次对str添加字符带来扩容的麻烦。对于同样的string类字符串,不同操作系统的不同平台的编译器capacity()返回的值不尽相同,具体和。end():指向不可以修改(只读)的string类字符串(c为const的首字母)begin()和end():指向两种类型的string类字符串。

2025-05-03 10:08:37 1117

原创 L45.【LeetCode题解】LCR 016. 无重复字符的最长子串

思想类似,都可以使用left和right来维护滑动窗口,如果right指向的字符与字符串的字符不重复,right++,如果right指向的字符与子字符串的字符重复,left++,枚举所有子串,之后判断每个子串是否无重复字符,固定左边界left,right从left+1。,查找以left为起点的无重复字符的子串,一旦发现right指向重复的字符,left++有可能重复的元素在窗口的中间的某个位置,此时需要。1.left++: 尝试去除重复的元素,,直到窗口中没有重复的元素才能更新结果,,所以其长度为 1。

2025-05-02 14:31:23 500

原创 L44.【LeetCode题解】面试题 01.07. 旋转矩阵(四种方法)

的起始点和终止点分别为A、B、C和D,则 A_x、A_y、B_x、B_y、C_x、C_y、D_x和D_y分别为它们的横纵坐标。矩阵表示的图像,其中每个像素的大小为 4 字节。如果对于一个N*N的矩阵,对其进行按行翻转,可以左乘矩阵。的起始点分别为旋转前矩阵的右下角和旋转后矩阵的做下角),代码遵循矩阵的乘法规则进行处理(注:和0相乘没有意义)注:将矩阵对称时,注意只需要对称上三角的元素(A和C的坐标是固定的,对于N*N的方阵而言,可由此来计算旋转后各个元素的坐标。不占用额外内存空间能否做到?

2025-05-01 09:18:31 1146

原创 L43.【LeetCode题解】转置矩阵(C语言)

则可以推出:returnSize是返回矩阵的行数, *returnColumnSizes数组存储返回矩阵的每一行元素的个数(即列数)可以得出:matrixSize是矩阵的行数,矩阵第i行的元素个数为matrixColSize[i](i从0开始算)calls free(),即假定调用者调用了free(),transpose函数是被调用者调用的。注意不用写free(),LeetCode上注释写着:assume。是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。给你一个二维整数数组。

2025-04-30 13:05:20 323

原创 CC50.【C++ Cont】滑动窗口

right从左边界向后枚举,right每指向一个新数,就为sum加上这个新数(思想类似前缀和,比方法1每次循环重新计算一遍sum要快)此时sum>target,记录len的值:right-left+1==4,但这个len不一定是最小值,因此要继续"滑动"窗口。left++,为"出窗口"(移除旧数据)sum减去对应的值,注意right不用回退,要利用。给定闭区间[left,right],left为区间左边界,right为区间的右边界。如果sum<target,right++,为"进窗口"(

2025-04-29 20:13:50 1063

原创 CD34.【C++ Dev】STL库的string的使用 (上)

传参的类型为const string,为拷贝构造,只不过是拷贝构造str的子串,显然第3个参数是缺省参数,如果不写,默认从pos位置一直截取的string风格的字符串的结尾。,(具体的扩容策略和编译器的处理有关,没有统一的规定),C语言strcat,不能自动扩容且找\0耗时。发现\0不显示,且不占位,因为VS认为str[i]超出界限,因此没有为\0占位。const char*为C语言风格的字符串类型,因此为使用C风格的字符串构造。猜测这是为变量i赋初值,因此[ebp-3Ch]存的是i的值, 由。

2025-04-28 09:54:05 1060

原创 CD33.【C++ Dev】初识模版

可以类比模具,优点:将数据类型作为参数传递,这样就不需要为不同的数据类型编写相同的代码模版其实是有泛型编程的思想: 编写与类型无关的通用代码,是代码复用的一种手段改造CD14.【C++ Dev】类和对象(5) 析构函数和拷贝构造函数文章的代码public:return;top = 0;~MyStack()//需要手动释放资源free(a);int top;T* a;int top。

2025-04-27 10:08:19 1177

原创 CD32.【C++ Dev】类和对象(22) 内存管理(下)

6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。3. malloc申请空间时,需要手动计算空间大小并传递.new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可。4. malloc的返回值为void*,在使用时必须强转,new不需要,因为new后跟的是空间的类型。free只会释放空间,不会调用析构函数,结束后需要手动置空(第6点)

2025-04-26 19:47:33 1016

原创 L22.5.【LeetCode题解】环形链表(返回环的入口点 方法2)

给定一个链表,返回链表开始入环的第一个节点。从链表的头节点开始沿着。指针进入环的第一个节点为环的入口节点。如果链表无环,则返回。来表示链表尾连接到链表中的位置(索引从 0 开始)。之后断开相遇点与后一个节点之间的链接(设相遇节点为meet,即。这就转换成了相交链表问题,求出相交节点的地址即可。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。为了表示给定链表中的环,我们使用整数。返回索引为 1 的链表节点。返回索引为 0 的链表节点。,则在该链表中没有环。

2025-04-25 18:58:20 561

原创 E47.【C语言】零散的练习题(1)

char acX[] = "abc"等价为'a','b','c','\0'(字符串结尾隐藏\0) ,而char acY[] = { 'a','b','c' };由单个字符排列,结尾没有\0,因此acX占用的内存空间比acY占用的大,C正确,不选,且acX和acY没有用const修饰,因此A正确,不选。strlen求有效字符串的长度,而str_arg指向的字符串为"Hello"加上隐藏的\0一共5个字符,因此第二个打印4。,因此在定义指针时,不能修改指针所指向的内容,需要用const修饰。

2025-04-24 08:27:44 914

C语言指针文章(H)的入口函数的测试程序

入口函数的测试程序

2025-04-24

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

【Cheat Engine】官方教程步骤8:多级指针详解文章的多级指针演示程序包

2025-04-19

8086汇编用栈来分解并显示数字的bin文件

用栈来分解并显示数字文章的bin文件,可以写入vhd

2024-10-26

C语言模拟试卷1第一大题要点提示

C语言模拟试卷1题目+答案

2024-10-01

汇编实现从1加到1000的bin文件

这是汇编实现从1加到1000文章的配套资源,bin文件写入主引导扇区后可在VirtualBox上运行

2024-09-14

汇编语言在虚拟机中输出“Hello World!”的bin文件

bin文件

2024-09-05

VS 2022的float.h

float.h详细内容

2024-07-15

VS 2022的limits.h

limits.h详细内容

2024-07-15

空空如也

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

TA关注的人

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