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

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

原创 【x86汇编】C语言的switch&case结构的反汇编分析
push ebppush ebxpush esipush edipush ebp指令未执行时,打开寄存器窗口发现ESP=0x0012FFC18,为画栈区图做准备EBP的值入栈后,再次查看寄存器窗口发现有两个寄存器的值发生变动:EIP和ESPEIP寄存器(Extend Instruction Pointer 扩展指令指针寄存器,其存储指令的地址。
2024-10-29 19:57:40
1576
原创 L51.【LeetCode题解】438. 找到字符串中所有字母异位词(四种方法)
1.题目2.分析暴力解法方法1:排序(超时)方法2:哈希表(险过) ★判断两个哈希表是否相同算法(通用方法,必须掌握)能相等的前提:两个哈希表的大小相等哈希表有迭代器,可以使用范围for从头到尾遍历提交结果优化方法:定长滑动窗口提交结果使用哈希数组更快提交结果★★★更优化的方法:不定长滑动窗口(比定长的要快!)提交结果
2025-05-11 15:41:31
770
原创 CD37.【C++ Dev】string类的模拟实现(上)
1.string基本知识的回顾2.简单的模拟实现准备操作代码实现成员变量构造函数C风格构造的函数无参构造函数C风格构造的函数与无参构造函数合二为一析构函数c_str()size()operator[ ]可读可写只可读iterator(指针版)begin()和end()push_back(char c)
2025-05-10 08:40:52
477
原创 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
1147
原创 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
760
原创 CD36.【C++ Dev】STL库的string的使用 (下)
优点:写reserve后,插入少量字符时后面不需要扩容,避免异地扩容消耗时间有可能reserve的参数大小比原字符串的大小要小,但有字符串的情况下reserve不会缩容,且不会改变size[点击并拖拽以移动]如果没有字符串的情况下(即空串),可能会缩容,也可能什么都不做,具体和STL的实现有关(因为没有规定要缩容,而且缩容是释放原空间,开辟新的小空间,用时间换空间,代价较大,因此不建议使用与缩容有关的函数)如果reserve()比capacity小,不HJ1 字符串最后一个单词的长度。
2025-05-07 14:19:51
1056
原创 OS7.【Linux】基本指令入门(6)
可以看文件的后缀名:.zip、.gz 、 .bz2、.xz、.tar、.tar.gz.、tar.bz2、.tar.xz ......可以看出:上方文件的后缀名的打包和压缩方案都不同.下面重点介绍tar打包方案由于tar命令下的选项十分多,这里将两个组合选项。
2025-05-06 09:30:05
810
原创 OSE2.【Linux】练习:查找项目的main函数入口
登录后,在gitee主界面的右上角选择:从GitHub/GitLab导入仓库。如果显示已经有镜像仓库可以直接访问镜像网站。,在Linux下查找其main函数入口。首先切换到root用户下安装git指令。使用ls -l查看是否成功clone。grep指令的复习参见文章。等待clone完成即可。之后复制代码到终端运行。
2025-05-05 10:14:14
453
原创 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
888
原创 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
1059
原创 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
464
原创 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
1124
原创 L43.【LeetCode题解】转置矩阵(C语言)
则可以推出:returnSize是返回矩阵的行数, *returnColumnSizes数组存储返回矩阵的每一行元素的个数(即列数)可以得出:matrixSize是矩阵的行数,矩阵第i行的元素个数为matrixColSize[i](i从0开始算)calls free(),即假定调用者调用了free(),transpose函数是被调用者调用的。注意不用写free(),LeetCode上注释写着:assume。是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。给你一个二维整数数组。
2025-04-30 13:05:20
314
原创 CC52.【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
1047
原创 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
1037
原创 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
1143
原创 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
989
原创 L22.5.【LeetCode题解】环形链表(返回环的入口点 方法2)
给定一个链表,返回链表开始入环的第一个节点。从链表的头节点开始沿着。指针进入环的第一个节点为环的入口节点。如果链表无环,则返回。来表示链表尾连接到链表中的位置(索引从 0 开始)。之后断开相遇点与后一个节点之间的链接(设相遇节点为meet,即。这就转换成了相交链表问题,求出相交节点的地址即可。链表中有一个环,其尾部连接到第二个节点。链表中有一个环,其尾部连接到第一个节点。为了表示给定链表中的环,我们使用整数。返回索引为 1 的链表节点。返回索引为 0 的链表节点。,则在该链表中没有环。
2025-04-25 18:58:20
555
原创 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
887
原创 CCE13.【C++ Cont】练习题组13 静态链表专题
第 2∼N 行,第 i 行包含两个整数 k,p,其中 k 为小于 i 的正整数,p 为 0 或者 1。若 p 为 0,则表示将 i 号同学插入到 k 号同学的左边,p 为 1 则表示插入到右边。2∼N 号同学依次入列,编号为 i 的同学入列方式为:老师指定编号为 i 的同学站在编号为 1∼(i−1) 中某位同学(即之前已经入列的同学)的左边或右边;第二行 n 个整数,其中第 i 个数表示编号为 i 的小朋友后面的人的编号。一行,包含最多 N 个空格隔开的整数,表示了队列从左到右所有同学的编号。
2025-04-23 14:23:22
757
原创 CD31.【C++ Dev】类和对象(21) 内存管理(中)
注:operator new[]实际多次调用operator new和构造函数,operator delete[]实际多次调用析构函数和operator delete。(如果malloc申请空间,成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常)先调用析构函数~Mystack():释放_arr指向的空间,并为_arr置空,将_capacity和_size清零。malloc申请空间如果失败,会返回空指针,但是new和malloc不同,new申请空间失败会。
2025-04-22 09:39:44
605
原创 CD30.【C++ Dev】类和对象(21) 内存管理(上)
目录1.前置知识易错点汇编语言底层分析常量区的字符串拷贝到栈区2.new和delete知识回顾分析new和delete的细节new不带参的构造函数带参的构造函数deletenew和malloc不能混用,delete和free也不能混用使用new和delete操作对象时,构造函数和析构顺序明确以下内容:程序运行会产生一些数据,而这些数据可以是局部数据、静态数据、全局数据、常量数据、动态申请的数据等,数据需要在内存中的不同区域存储,这些不同区域为:栈区、堆区、静态区(又称数据段,存储全局数据和静态数据)、常量区
2025-04-21 10:07:03
1131
原创 CD29.【C++ Dev】类和对象(20) 构造函数和拷贝构造函数的优化
的左边的ret类型为Myclass,右边1类型为int,如果使用赋值符号,如果没有优化,编译器会使用1去构造一个临时对象,再将这个临时对象拷贝构造给ret;时,先调用func函数,因为函数接收的参数是Myclass obj,,再将这个匿名对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。,再将这个临时对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。,再将这个临时对象拷贝构造给func的形参,由于是连续构造,编译器会优化为一次构造。
2025-04-20 09:24:43
896
原创 【Cheat Engine】官方教程步骤8:多级指针 超详解!
3.Myclass1中有Myclass2的指针,Myclass2中有Myclass3的指针,......以此来模拟多级指针。了这个地址"(注意不是改写,因为没有在教程中单击"改变指针",因此指针并没有变,只不过被访问到了)mov [esi+18],eax中将eax的值放入esi+18指向的值,那么指针一定和esi有关。不要勾选"十六进制",勾选"指针",依次填入偏移量,单击"确定"教程中单击"改变指针",试着将基址中的值更改为5000,并锁定它。复制ESI的值后关闭调试器,勾选HEX,搜索ESI的值。
2025-04-19 09:15:03
876
原创 L42.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且的四元组bcd你可以按返回答案。
2025-04-18 09:49:58
1012
原创 NC3.【牛客网】与日期有关问题的题组
注:由于下面这些题的解题思路在知识回顾的文章中穿插讲过,部分题可以直接套用之前文章的代码,于是本文不提供思路只提供通过的代码。CD19.【C++ Dev】类和对象(10) 日期类对象的成员函数(日期+天数)CD17.【C++ Dev】类和对象(8):赋值运算符。
2025-04-17 14:42:49
325
原创 L41.【LeetCode题解】三数之和(双指针思想)
使用左右指针left和right来移动,如果满足题目条件,就将{nums[left],nums[right],nums[bound]}尾插到类型为vector<vector<int>> 的ret中。显然需要去重,right前后都是-1,需要跳过重复的情况,可以比较right前后的值是否相同,使用循环来跳过所有重复的情况,因为。的情况下且至少有两个三元组的元素相同时,需要去重,前提是和为0,如果>0或<0,不需要去重。例如给定以下数组[-1,0,1,2,1,-4],排过序后为[-4,-1,0,1,1,2]
2025-04-16 14:26:29
1204
原创 CD28.【C++ Dev】类和对象(19) 内部类练习题和匿名对象
/没有名字return 0;Myclass(1);是一个没有名字的对象,即匿名对象。
2025-04-15 09:04:22
855
原创 CD27.【C++ Dev】类和对象 (18)友元和内部类
否则编译器在遇到Myclass1的友元函数的声明friend void function(const Myclass1& obj1, const Myclass2& obj2);友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员,这是由friend的特性实现的。解释:const修饰一般修饰的是成员函数,显然友元函数不属于任何类,3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。因为友元函数不属于任何类,所以可以是多个类的友元函数。,这里介绍友元函数的几个特点。
2025-04-14 11:05:15
1115
原创 L40.【LeetCode题解】查找总价格为目标值的两个商品(剑指offer:和为s的两个数字) (双指针思想,内含详细的优化过程)
购物车内的商品价格按照升序记录于数组price。请在购物车中找到两个商品的价格总和刚好是target。若存在多种情况,返回任一结果即可。[3,15] 或者 [15,3][27,34] 或者 [34,27]
2025-04-12 19:36:43
1016
原创 L39.【LeetCode题解】有效三角形的个数 (双指针思想)
left向右移动时,均满足nums[left]+nums[right]==2+9>nums[bound]变化的,因此当nums[i]+nums[j]>nums[k]时,提前结束对k的循环,节省时间。以排过序的数组{2,2,3,4,5,9,10}为例,bound从右向左移动,三层循环,枚举所有三条边的组合,满足"任意两边之和大于第三边",计数器++先对数组排序,之后使用原来的三重循环,只不过在一个一个枚举的时候,(注:虽然2,3,4是重复的,但仍然要计入)2,3,4 (使用第一个 2)
2025-04-11 14:16:36
676
原创 CD26.【C++ Dev】类和对象(17) static成员(下)
由于Myclass定义在Solution外,如果Sum_Solution()函数要取得_ret的值,在Myclass类中需要定义一个GetRet()函数来取得。文章中的特点6提到过:原本的静态成员函数的参数是没有隐藏this指针的,而调用非静态成员函数需要传this指针,因此不可以调用。则_ret初始化为0,_i初始化为1,执行一次构造函数时,_ret+=_i并且_i++需要用两个静态变量,一个存储累加的和(_ret),一个来控制每次相加的数字(_i)如果要强行调用非静态成员函数其实也是可以的,不过要。
2025-04-10 14:45:47
1002
原创 CD25.【C++ Dev】类和对象(16) static成员(上)
不添加int main()function();function();return 0;分析:虽然调用两次function函数,但是myobj只会初始化一次,因此打印结果都是1。
2025-04-09 14:54:28
738
原创 CD24.【C++ Dev】类和对象(15) 初始化列表(下)和对象隐式类型转换
由CD23对缺省参数和初始化列表的关系的说明可知:所有成员变量在初始化时都要走初始化列表,_val给了缺省参数0,则在执行_val = 10前,_val的值应该为缺省参数0。,1._val2(_val1)可以看出,_val2初始化的是_val1的值,但_val1此时还没有初始化,操作系统为_val1内存空间赋的是随机值,导致_val2是随机值。Myclass myobj2(1)传了一个参数,因此初始化时会调用Myclass(int data),导致_va的值l被初始化为10。
2025-04-08 08:08:22
1027
原创 L38.【LeetCode题解】盛最多水的容器 (双指针思想)
给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i, 0)和。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。你不能倾斜容器。49图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。1。
2025-04-07 21:50:13
847
原创 CD23.【C++ Dev】类和对象(14) 取地址重载函数和初始化列表(上)
1.CD22文章的4个问题的分析2.普通对象取地址重载函数和const 修饰的对象据地址重载函数3.构造函数中的初始化列表成员函数初始化的两种方法 方法1:函数体内赋值方法2:初始化列表格式代码示例注意事项引用成员变量必须在初始化列表中初始化const成员变量必须在初始化列表中初始化自定义类型成员必须在初始化列表中初始化(且该类没有
2025-04-06 09:54:09
679
原创 L37.【LeetCode题解】快乐数(双指针思想)
本题n的类型为int,而int类型的最大值为2147483647,process(2147483647)==260,则给定任意一个。n,process(n)的结果在[1,260],则经过261次运算,至少有两次process执行的结果是相同的,因此结果是循环的。,再判断"快数"和"慢数"相遇的值即可("快数"和"慢数"选任何一个判断其值),如果为1,为快乐数,反之不是快乐数。设"快数"为fast,慢数为slow,初始值都为n,"快数"一次循环变化两次,"慢数"一次循环变化一次,,没有其他不循环的情况。
2025-04-05 10:42:40
457
原创 从Redis源码看大小端序的转换
..:表示额外的参数,可有可无,是否有额外的参数取决于format指向的字符串,例如"%d",2中2为额外的参数,这一点和printf一样,这里也不再赘述。向已定大小的缓冲区(sized buffer)写入格式化(formatted)的缓冲区(buffer,其实是数组)16代表16bit,即2个字节,临时指针变量x接收指针p的值,使用中间变量t来交换x[0]和x[1]存储的值。,因为字符串的结尾要填充\0,n-1+1==n,这样正好填满容量为n个字符的buffer数组。
2025-04-04 10:54:43
722
原创 CD22.【C++ Dev】类和对象(13) 流提取运算符的重载和const成员
表示this指向的对象可以修改,void Date::Print() const表示this指向的对象不可以修改,从可以修改到不可以修改为权限的缩小,正常运行。d1<d2的执行会有问题,由d1的定义可知:d1的成员对象不能修改,而bool Date::operator< (const Date& d2)第一个参数为this,与d1的地址对应,导致。Print()中隐藏的参数是this,虽然this指针的类型为const Date*,但是 const Date*中const。
2025-04-03 15:11:19
1024
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人