自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 双指针算法

给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。nums =nums =[0][0]你能尽量减少完成的操作次数吗?定义两个指针cur和dest,这里的指针采用的数组下标来充当指针。cur:从左往右遍历数组;dest:已处理区间内,非零元素的最后一个位置;非0区间:[0, dest]0区间:[dest + 1, cur - 1]待处理区间:[cur, n- 1]cur从左往右遍历过程中:① 遇到0元素:cur++;

2025-03-18 16:54:12 362

原创 Linux:自动化构建-make/Makefile

自动化构建make/makefile

2025-03-12 18:44:48 1449

原创 C++:list容器(上篇)

rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动。begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动;

2025-03-11 19:34:12 1114

原创 C++:vector容器(上篇)

(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造it!

2025-03-09 19:14:39 1314

原创 C++:string容器(下篇)

string容器模拟与实现。

2025-03-08 20:35:27 572

原创 C++:string容器(上篇)

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变;,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size();故总共占16+4+4+4=28个字节。

2025-03-07 18:03:18 700

原创 C++:模板(下篇)

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2. 增强了代码的灵活性。【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长。2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。完。

2025-03-06 17:21:14 910

原创 C++:模板(上篇)

class 类模板名// 类内成员定义// 类模版public :_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲// 扩容++_size;

2025-03-05 21:04:04 884

原创 Linux:vim快捷键

【代码】Linux:vim快捷键。

2025-03-04 23:09:11 375

原创 C语言实现通讯录

/ 定义联系人数据结构// 姓名 性别 年龄 电话 地址// 姓名// 性别int age;// 年龄// 电话// 地址}peoInfo;

2025-03-03 21:56:56 1072

原创 C++:new和delete操作符

int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间// 还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;

2025-03-02 19:06:12 1171

原创 C++:类和对象(下篇)

定义时不添加static关键字。3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问。4.

2025-03-01 20:20:28 1497

原创 C++:类和对象(中篇)

默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们叫做浅拷贝,或者值拷贝。

2025-02-28 17:39:46 1387

原创 C++:类和对象(上篇)

/ 类体:由成员函数和成员变量组成//这里的分号不能省略class为定义类的关键字ClassName为类的名字{}中为类的主体,特别要注意类定义结束时后面分号。类中的元素称为类的成员;类中的数据称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。//声明和定义全部放在类体中public://显示基本信息private://姓名char* _sex;//性别int _age;

2025-02-27 17:53:03 1667

原创 【C语言】编译和链接

在ANSI C的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。第2种是执行环境,它用于实际执行代码。2. 翻译环境那翻译环境是怎么将源代码转换为可执行的机器指令呢?这里我们就得展开讲解一下翻译环境所做的事情。其实翻译环境是由和两个大的过程组成的,而又可以分解成:预处理(有些书也叫预编译)、编译、汇编三个过程。一个C语言的项目中可能有多个文件一起构建,那多个文件如何生成可执行程序呢?

2025-02-26 18:41:22 1638

原创 Linux的权限

• 目录的可执行权限是表示你可否在目录下执行命令。• 如果目录没有 -x 权限,则无法对目录执行任何命令,甚至无法 cd 进入目录,即使目录仍然有 -r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)。• 而如果目录具有 -x 权限,但没有 -r 权限,则用户可以执行命令,可以 cd 进入目录。但由于没有目录的读权限。• 所以在目录下,即使可以执行 ls 命令,但仍然没有权限读出目录下的文档。

2025-02-25 17:12:42 838

原创 【C语言】预处理

define reg register //为 register这个关键字,创建⼀个简短的名字;) //⽤更形象的符号来替换⼀种实现case //在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。思考:在define定义标识符的时候,要不要在最后加上;?建议不要加上;,这样容易导致问题。max = MAX;

2025-02-24 17:12:16 1002

原创 【C语言】文件操作

上⾯说的适⽤于所有输⼊流⼀般指适⽤于标准输⼊流和其他输⼊流(如⽂件输⼊流);所有输出流⼀般指适⽤于标准输出流和其他输出流(如⽂件输出流)。

2025-02-23 18:51:18 2137

原创 【C语言】动态内存管理

我们已经掌握的内存开辟方式有:但是上述的开辟空间的方式有两个特点:• 空间开辟大小是固定的。• 数组在申请的时候,必须指定数组的长度,数组空间⼀旦确定了大小不能调整。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道,那数组的编译时开辟空间的⽅式就不能满⾜了。C语言引入动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。C语言提供了⼀个动态内存开辟的函数:这个函数向内存申请⼀块连续可用的空间,并返回指向这块空间的指针。• 如果开辟成功,则返回⼀个指向

2025-02-22 17:46:46 1318

原创 【C语言】自定义类型:联合体和枚举

上述的结构其实设计的很简单,⽤起来也⽅便,但是结构的设计中包含了所有礼品的各种属性,这样使得结构体的⼤⼩就会偏⼤,⽐较浪费内存。所以我们就可以把公共属性单独写出来,剩余属于各种商品本⾝的属性使⽤联合体起来,这样就可以介绍所需的内存空间,⼀定程度上节省了内存。联合体的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合体至少得有能力保存最大的那个成员)。在C语⾔中是可以的,但是在C++是不行的,C++的类型检查比较严格。{}中的内容是枚举类型的可能取值,也叫 枚举常量。

2025-02-21 19:20:19 1375

原创 【C语言】结构体内存对齐问题

我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的?内存是如何分配的?所以我们得知道如何。

2025-02-20 17:54:02 3207 3

原创 C++:iterator迭代器失效

但我们要记住,虽然可以这样解决,但是erase(it)之后,不要再去访问it迭代器,它已经失效了。正确做法,最好是在insert之后不要使用它的迭代器!

2025-02-19 18:20:21 436

原创 【C语言】整数和浮点数在内存中的存储

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

2025-02-18 09:23:18 1299 1

原创 【C语言】自定义类型:结构体

答案是不⾏的,因为Node是对前⾯的匿名结构体类型的重命名产⽣的,但是在匿名结构体内部提前使⽤Node类型来创建成员变量,这是不⾏的。仔细分析,其实是不⾏的,因为⼀个结构体中再包含⼀个同类型的结构体变量,这样结构体变量的⼤⼩就会⽆穷的⼤,是不合理的。3. 结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的。4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构。体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

2025-02-17 18:34:23 1368

原创 C++:构造函数和析构函数

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值。默认成员函数很重要,也比较复杂,我们要从两个方面去学习:

2025-02-16 19:05:03 1055

原创 【C语言】qsort函数的使用

使用qsort函数排序整型数据。

2025-02-15 16:38:01 816

原创 【C语言】内存函数

• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。• 如果source和destination有任何的重叠,复制的结果都是未定义的。memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。• ⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节。

2025-02-14 11:20:44 904 1

原创 【C语言】左旋字符串(三种实现方式)

这时,我们可以这样理解,虽然我们旋转了4个字符,但我们实际上我们旋转了0个字符;依次类推,旋转5个字符,实际上旋转了1个字符;接下去也是如此......接下来,我们再把字符长度加长,变成abcde 5个字符,旋转 k = 5 个字符时,数组就回到了本身数组 abcde,后面的分析就跟4个字符分析是一样的。就是我们每一次旋转之前,我们就取出 arr 数组的首元素存放在 tmp 中,然后将 arr 数组剩余的每一个元素都往前移动一位,最后我们再把 tmp 中的元素放回 arr 数组末尾的位置。

2025-02-13 16:50:49 1061

原创 【C语言】字符函数和字符串函数

这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

2025-02-12 16:07:42 1525 1

原创 数据结构--迷宫问题

以上迷宫OJ题曾经是百度某一年的其中一个笔试题,迷宫问题本质就是一个图的遍历问题,从起点开始不断四个方向探索,直到走到出口,走的过程中我们借助栈记录走过路径的坐标,栈记录坐标有两方面的作用,一方面是记录走过的路径,一方面方便走到死路时进行回溯找其他的通路。本题在曾经是滴滴某一年的笔试题,本题在上一个题的基础上计入了体力值的概念,但是本题还有一个隐藏条件,就是要找出迷宫的最短路径,如下图的两个测试用例,需要找出最短路径,才能通过全部测试用例。

2025-02-11 16:34:49 339

原创 外排序之文件归并排序

通常来说,外排序处理的数据不能一次装入内存,只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是⼀种“排序--归并”的策略。在排序阶段,先读入能放在内存中的数据量,将其排序输出到⼀个临时文件,依此进行,将待排序数据组织为多个有序的临时文件。然后在归并阶段将这些临时文件组合为⼀个大的有序文件,也即排序结果。归并排序的思想不需要随机访问数据,只需要依次按序列读取数据,所以归并排序既是⼀个内排序,也是⼀个外排序。

2025-02-09 17:06:43 449

原创 【C语言】sizeof和strlen的比较

1. sizeof和strlen的对比1. sizeof和strlen的对比1.1 sizeof在学习操作符的时候,我们学习了sizeofsizeof 是一个单目操作符, 绝对不是函数!!!sizeof 计算变量所占内存内存空间⼤⼩的,单位是字节。如果操作数是类型的话,计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。运行结果:1.2 strlenstrlen是C语⾔库函数,功能是求字符串⻓度。统计的是从strlen。

2025-02-08 16:03:34 757

原创 快排优化:三路划分和自省排序

决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选key基本二分居中,那么快排的递归树就是颗均匀的满⼆叉树,性能最佳。但是实践中虽然不可能每次都是二分居中,但是性能也还是可控的。但是如果出现每次选到最小值/最大值,划分为0个和N-1的子问题时,时间复杂度为O(N^2),数组序列有序时就会出现这样的问题,我们前面已经用三数取中或者随机选key解决了这个问题,也就是说我们解决了绝大多数的问题,但是现在还是有⼀些场景没解决(数组中有大量重复数据时),类似以下代码。

2025-02-08 16:01:50 447

原创 数据结构--八大排序算法

当插入第 i(i>=1) 个元素时,前面的 array[0],array[1],…,array[i-1] 已经排好序,此用 array[i] 的排序码与 array[i-1],array[i-2],… 的排序码顺序进行比较,找到插入位置即将 array[i] 插入,原来位置上的元素顺序后移。2. 希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定⼀个整数(通常是 gap = n/3 + 1),把待排序文件所有记录分成各组,所有的距离相等的记录

2025-02-07 15:19:10 2266 2

原创 【C语言】指针详细解读4

⾸先我们再次理解⼀下⼆维数组,⼆维数组其实可以看做是每个元素是⼀维数组的数组,也就是⼆维数组的每个元素是⼀个⼀维数组。所以,根据数组名是数组⾸元素的地址这个规则,⼆维数组的数组名表⽰的就是第⼀⾏的地址,是⼀维数组的地址。那就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,那么形参也是可以写成指针形式的。那么要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。

2025-02-06 09:29:57 1081 1

原创 【C语言】指针详细解读3

⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。4. ⼆级指针指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪⾥?这就是。

2025-02-05 22:34:14 1652

原创 【C语言】指针详细解读2

1.const 修饰指针1.const 修饰指针1.1 const修饰变量变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。编译结果:上述代码中n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加了限制,只要我们在代码中对n就⾏修改,就不符合语法规则,就报错,致使没法直接修改n。

2025-02-04 10:26:57 1332 1

原创 【C语言】指针详细解读1

1. 内存和地址1. 内存和地址1.1 内存在讲述内存之前,我们先拿生活中的例子类比一下:假如我们要寻找酒店的一位朋友,首先我得知道以下一些信息:知道他是,知道酒店名,知道酒店房间号。就表示我们不能去找其他的东西:桌子、凳子等等,只能是是人。酒店名就表示我们只能在这个酒店去寻找,不能去其他地方寻找。房间号就表示我们去酒店的这个地方就能找到。我们把上述的例子对照到我们计算机中,就很好理解。

2025-02-03 11:28:26 1896 3

原创 【C语言】操作符详解

8进制的数字每⼀位是0~7的,0~7的数字,各⾃写成2进制,最多有3个2进制位就⾜够了,⽐如7的⼆进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算⼀个8进制位,剩余不够3个2进制位的最左侧补0换算。表达式的整型运算要在CPU的相应运算器件内执⾏,CPU内整型运算器(ALU)的操作数的字节⻓度⼀般就是int的字节⻓度,同时也是CPU的通⽤寄存器的⻓度。如果某个操作符的各个操作数属于不同的类型,那么除⾮其中⼀个操作数的转换为另⼀个操作数的类型,否则操作就⽆法进⾏。

2025-01-26 20:11:23 1082

原创 Linux添加白名单用户

passwd 用户名。

2025-01-25 17:07:25 167

空空如也

空空如也

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

TA关注的人

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