- 博客(237)
- 收藏
- 关注
原创 算法题训练 ——— AB5 点击消除
a 先入栈,入栈后看是否和 b 相同,不同的话 b 也入栈,然后第三个 b 判断和栈顶元素是否相同,因为此时栈顶元素是第二个 b,是相同的,所以把栈顶元素的 b 和第三个 b 消除掉,最后把 两个 a 也消除掉。他每次“点击”,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"。但是可以使用 sting 来模拟栈结构,因为 sting 是有尾插尾删的功能的,刚好模拟栈的出栈入栈。一个字符串,为“点击消除”后的最终形态。但相同而不相邻、不相同的相邻字母都是不可以被消除的。
2025-04-07 14:20:38
114
原创 算法题训练 ——— BC64 牛牛的快递
牛牛正在寄快递,他了解到快递在 1kg 以内的按起步价 20 元计算,超出部分按每 kg 1元计算,不足 1kg 部分按 1kg计算。如果加急的话要额外付五元,请问牛牛总共要支付多少快递费。
2025-04-07 14:20:12
232
原创 算法题训练 ——— BC153 [NOIP2010]数字统计
请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。
2025-02-25 22:44:58
292
原创 算法题训练 ——— NC313 两个数组的交集
给定两个整数数组分别为nums1nums1, nums2nums2,找到它们的公共元素并按返回数据范围:1≤nums1.length,nums2.length≤10001≤nums1.length,nums2.length≤10001≤nums1[i],nums2[i]≤10001≤nums1[i],nums2[i]≤1000输入:[1,2 ],[2,2,2,2]返回值:[2]说明:两个数组的公共元素只有2 示例2输入:[1,2,3],[8,2,2,3,8]返回值:[2,3
2025-02-25 22:44:17
327
原创 C++ ——— 二叉搜索树
那么 14 节点就是右子树为空,创建一个 parent 节点指针指向 14 节点的父亲,也就是 10 节点,并且直接判断 14 节点是 10 节点的左还是右,因为 14 节点的右为空,所以判断后 10 节点直接链接 14 节点的左即可。以上代码中我实现的是找出右子树最小的节点进行交换,所以 subLeft 就是找到右子树中最小的那个节点,也就是最左边的那个节点,subParent 指向 subLeft 的父亲节点。二叉搜索树:一棵二叉树,可以为空;左子树的值要小于根节点的值,右子树的值要大于根节点的值。
2025-02-24 21:48:53
736
原创 C++ ——— 模拟实现 AVL 树的插入
因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。节点 3 的左节点的高度为 3,右节点的高度为 2,那么节点 3 的 -1 是 2 减去 3 得来的,所以可以看出是。节点 7 的左节点高度为 2,右节点高度为 3,3减去2 就是节点 7 的平衡因子。
2025-02-23 13:24:57
265
原创 C++ ——— 继承的概念及其使用
2. 基类中的 protected(保护) 成员,以 public 和 protected 的方式继承到了派生类后,派生类还是能以 protected 的形式访问,只是以 private 的方式继承后,在派生类中就会变成 private 的形式访问,可以把这种改变理解为权限可以放大或者平移,但是缩小后就要根据缩小的方式访问。需要注意的是:基类和派生类的赋值,只能是派生类赋值给基类对象/基类指针/基类的引用,不你能把基类赋值给派生类。
2025-02-06 15:00:13
957
原创 C++ ——— 多态的概念及其原理和实现
1. 虚函数重写继承关系中父类和子类的两个虚函数,需要虚函数的函数名、参数、返回类型都相同,才构成虚函数重写2. 必须使用父类的指针或者引用去调用虚函数才能实现多态public:cout << "普通人买票 - 全价" << endl;public:cout << "学生买票 - 半价" << endl;Student 类继承了 Person 类,它们各自类中的虚函数构成了重写,那么它们各自实例化后都使用父类的指针或者引用去调用,看是否会出现多态int main()Person p;
2025-02-06 14:59:49
756
原创 C++ ——— 仿函数
调用 Add 类中的函数重载时,就像是 add 是一个函数名,而括号中是参数,但是并不是如此。这是一个 Add 类,类里面有一个公有成员函数重载,重载的是括号。类似于这种类而调用的函数重载的形式就叫做仿函数。这时的仿函数就能根据不同的变量来使用。
2025-01-29 16:54:37
350
原创 C++ ——— 学习并使用 priority_queue 类
priority_queue 类为 优先级队列,其本质就是堆,可以通过穿模板参数控制其为大堆或者小堆。实例化为 int 类型。
2025-01-29 15:44:48
294
原创 C++ ——— 模拟实现 list 类
直接调用 erase() 函数清理数据,并且 erase() 会返回下一个节点的指针,所以不用担心 it 不能指向下一个位置。先对要构造的对象进行初始化,否则可能会发生报错,再利用范围 for 依次取出 lt 的内容尾插到构造的对象中。new 一个节点出来,并且节点的首尾指针指向自己。
2025-01-23 04:15:00
195
原创 C++ ——— 学习和使用 stack 类和 queue 类
栈的特性是:后进先出,且栈不支持迭代器访问,因为通过迭代器访问的话就不符合栈的后进先出的特性了,所以不支持。数据 1 是最先入栈的,所以也就是最后才能取出来,数据 5 是最后入栈的,那么就是最先取出来。数据 1 是先进队列的,那么也就是先出队列,数据 5 是最后进队列的,也就是最后出队列。队列的特性是:先进先出,同样不支持迭代器。同样是通过模板来自定义实例化类的类型。
2025-01-23 03:45:00
321
原创 C++ ——— 模拟实现 string 类
把模拟实现的 string 类放在命名空间里面,这样就能和编译器自带的 string 类区分开来并且也方便调试也参考编译器的 string 类。
2025-01-21 09:20:48
1020
原创 C++ ——— string类oj题:仅仅反转字母
根据 hoare 快速排序的思想,定义两个指针,各自指向左右下标。当左右下标的数据都为字母是就交换,否则就左下标递增或者右下标递减。直到左右下标相遇为止,相遇后就说明反转字母完成了。左右指针各自找字母时需要注意不要越界,
2025-01-18 11:05:22
304
原创 C++ ——— string类oj题:字符串中的第一个唯一字符
除了 m 之外的字符都出现了两次,那么 count 数组所对应的字符都会是 2 ,只有 m 所映射的字符会是 1 ,所以再通过 for 循环遍历只出现一次的字符,返回下标即可。再次通过统计的下标和计数排序找出第一个出现的唯一字符。两个 for 循环,是 2*N,去掉常数项,它的第一个不重复的字符,并返回它的索引。利用计数排序统计所有字符出现的次数。
2025-01-17 14:03:09
272
原创 C++ ——— 学习并使用 string 类
s1.begin() 是类似指向字符串首字符的指针,s1.end() 是指向字符串尾字符下一个位置,也就是 '\0' 的位置的指针,再通过 it 遍历。string 类是一个管理字符数组的对象,也就是一个管理字符的顺序表。除了字符串和字符串拼接,字符串还可以和常量字符串拼接,或者合并拼接。后续会将迭代器的底层逻辑一一实现出来,现在只需要知道如何使用即可。auto 自动识别类型,e 自动接收自动递增并结束。s1.size() 可以直接获取字符个数。把字母全改为 '*' 号。
2025-01-17 11:55:31
523
原创 C++ ——— 模板讲解及使用
对于两个变量的交换,一般实现一个交换函数来交换,但是不同的变量要用不同的类型,函数参数的就各抒己见,那么该如何实现呢根据函数重载的特性,可以实现这种通用的交换函数1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要再次手动增加对应的函数2. 代码的可维护性比较低,一个出错可能所有的重载均出错,且想要添加函数功能时需要在每一个实现的函数那里去添加所有在 C++ 中引入了模板的概念。
2025-01-15 13:47:38
387
原创 C++ ——— 学习并使用 new/delete
C++ 是兼容 C语言 的,那么在以前 C语言 中申请动态空间/扩容使用的 malloc/calloc/realloc 这些函数还是能在 C++ 中使用的int main()// 开辟 4 个 int 类型的动态空间// 判断是否开辟成功exit(-1);// 开辟 4 个 int 类型的动态空间,并且全初始化为 0// 判断是否开辟成功exit(-1);// 将 ptr2 指向的空间扩容至 8 个 int 类型的空间// 释放free(ptr1);free(ptr3);
2025-01-15 06:02:20
1195
原创 C++ ——— 内部类
如果一个类定义在另一个类的内部,这个内部类就叫做内部类,内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员,外部类对内部类没有任何优越的访问权限。B 类只是受 A 类域和访问限定符的限制,其实他们是两个独立的类,所以 sizeof(A) 就只是计算 A 这个类的大小。注意:内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员,但是外部类不是内部类的友元。内部类默认就是外部类的友元,但是外部类不能直接访问到内部类的私有函数。
2025-01-13 21:26:24
424
原创 C++ ——— 友元函数和友元类
比如以上代码,在 Time 类中声明 Data 类为友元类,那么可以在 Data 类中直接访问 Time 类的私有成员变量,但是想在 Time 类中访问 Data 类中私有的成员变量则不行。声明日期类为时间类的友元类,则在日期类中就能直接访问 Time 类中的私有成员变量。如果 C 是 B 的友元,B 是 A 的友元,但是并不能说明 C 就是 A 的友元。友元类的所有成员函数都可以是另一个类的有元函数,都可以访问另一个类中的非共有成员。友元函数可以访问类的私有和保护成员,但不是类的成员函数。
2025-01-13 15:04:19
376
原创 C++ ——— 类的 static 成员
所以要把 create 和 use 放在类中,但是这又会出现一个问题,那么就是每创建一个类,类中的 create 和 use 都是独立的,这样就不能统计了,所以要改为静态成员。再创建了一个匿名对象,匿名对象的特点是生命周期只在当前那一行,所以再打印是可以看到创建的对象加1,正在使用的对象还是2。声明为 static 的类成员称为类的静态成员,用 staic 修饰的成员变量,称之为静态成员变量。1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。那么对于这两个静态成员如何定义呢。
2025-01-08 14:25:36
349
原创 C++ ——— 匿名对象
第一个构造函数是 a1 调用的,而匿名对象的构造函数和析构函数是连续调用的,这就证明了匿名对象的生命周期只在那一行,最后程序结束时调用了 a1 的析构函数。这个类实现的功能是阶乘,那么只是想得到某个数的阶乘是多少,就能使用匿名对象来实现。在构造函数和析构函数中都显示打印出来了,方便查看各个实例对象的生命周期。有名对象的声明周期在 main 函数的这个局部域中。匿名对象的声明周期就在定义的这一行。
2025-01-08 13:11:59
322
原创 C++ ——— 单/多参数构造函数的隐式类型转换和 explicit 关键字
而第二个实例化对象 a2 是常量 2 调用构造函数生成一个临时对象,再用这个临时对象拷贝构造 a2 进行初始化的。对构造函数和拷贝构造函数都加上打印,看是否打印了拷贝构造就能知道 a2 是否是直接构造。可以看出,实例化 a1 和 a2 时都只调用了构造函数,并没有调用拷贝构造函数。在 A 这个类中的构造函数只有一个参数,这就称之为单参数的构造函数。关键字的作用是阻止隐式类型转换,这个关键字一般添加在构造函数的开始。第一个实例化对象 a1 是直接调用构造函数进行初始化的。
2024-12-30 12:51:39
325
原创 C++ ——— 类的 6 个默认成员函数之 取地址函数 以及 const取地址操作符重载函数
绝大部分情况下都不用自己显示的写,有编译器自动生成的就够了
2024-12-19 22:17:05
304
原创 C++ ——— const 修饰的对象如何正确调用函数
了解权限可以缩小和平移,但是不能放大,并且在函数后面加上 const 即可让 const 修饰的对象成功调用函数
2024-12-16 21:12:52
292
原创 C++ ——— 类的 6 个默认成员函数之 赋值运算符重载函数
类成员函数重载时,其形参看起来比操作数的数目少 1 ,因为成员函数的第一个为隐藏的 this
2024-12-14 00:14:02
403
原创 C++ ——— 类的访问限定符、声明和定义分离、所占空间的大小
class 中访问限定符的介绍以及说明,类的声明和定义分离的注意事项,以及类所占内存空间的大小
2024-12-09 18:00:12
963
原创 C++ ——— C++中常用关键字和语法的使用方法(auto、范围for)
范围 for 访问的概念是依次取 arr 数组中的数据赋值给 e ,且 e 是 auto 自动识别类型的
2024-12-06 12:01:21
366
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人