- 博客(36)
- 收藏
- 关注
原创 基础算法篇(2)(蓝桥杯常考点)—搜索
搜索搜索也叫做暴搜,在未优化前就是通过穷举所有情况来找到最优解搜索一般分为深度优先搜索和宽度优先搜索一般用到的优化方法是:回溯和剪枝回溯:在搜索过程中,遇到走不通或者走到底的情况时,就回头 剪枝:在搜索过程中,剪掉重复出现或者不是最优解的分支 用的数不重复的用排列组合思想去分析题(像eg:高中的C和A类型的题)
2025-03-24 09:09:03
3423
5
原创 算法基础篇(1)(蓝桥杯常考点)—基础算法
注意事项:1.多组测试时,一定要考虑需不需要清空数据一般是能覆盖的话(没覆盖的部分不用就行了)不清空或者还能用就不清空(权衡时间复杂度,清空是用时间换空间)2.int类型的无穷大可以搞为 int inf = 0x3f3f3f3f。
2025-03-17 08:09:25
6311
13
原创 C++(蓝桥杯常考点)
double在各编译器中的大小不同,因为一般用sizeof(double),浮点数自己一般用double类型的。易忘:int arr[][5]={{1,2},{3,4},{5,6}};字符数组一般用string替代,基本不用字符数组(string结尾不用'/0')循环一般用for,除非需要n次循环,喜欢用while(n--){ }int是2的31次方-1或者10的9次方(大于了就会超范围)switch的一个易忘用法:(switch的格式也容易忘)定义常量一般用const,定义的变量名一般用大写。
2025-03-03 07:43:11
4583
3
原创 哈希表和unordered_set和unordered_map
解决方法:给数组扩大为原来的两倍,然后取模的那个模数取离哈希表大小两倍最近的那个素数。面对哈希冲突时,需要设计出优秀的哈希函数并且处理哈希冲突,而不是去想着消除哈希冲突。如果数据存的太密集的话,用线性探测法就要找很久。如果数据冲突的太多的话,一个链表就会很长很长。解决方法:不用链表来挂,用红黑树来挂。
2025-02-24 09:23:26
1918
1
原创 红黑树和set与map
区分递增和严格递增(在写代码时不一样,数学中一般递增指的是严格递增)创建二叉搜索树不是为了排序,而是为了快速插入、删除以及查找元素。场景二:找出一堆字符串中,某一个字符串出现的次数--用map。场景一:判断一堆字符串中,某一个字符是否出现过--用set。INF这个变量名一般表示无穷大的意思。根节点未说明时,一般指的是那一个。
2025-02-23 11:13:21
357
1
原创 二叉树(数据结构)
像二叉树这样向一个地方走完了要回溯到之前去走其他路的采用递归很好。按照先序遍历的方法去手算处理这个二叉树。二叉树也是用过递归定义的结构。先序遍历又称前序遍历。
2025-02-20 18:46:24
1189
1
原创 树(数据结构·)
当一条路走完,走到不能再走的时候,那就回去(回到又可以走的地方,不一定是根结点),继续去找别的路。所谓的DFS,也就是说每次都尝试向更深的节点走,也就是一条路走到黑。里面没有结点时,称之为空树。树型结构是一对多的形式。
2025-02-19 19:18:31
467
2
原创 顺序表和vector
pair的重命名方式一般是采用eg:两个都是int类型的话就是PII,(I为int的首字母的大写)这里的前驱和后继的关系是针对于表中相邻元素而言的。线性表相关术语:表头、表尾、前驱、后继、空表。存在迭代器的容器才可以使用范围for。线性表中一个元素没有则叫空集。
2025-02-15 14:59:23
332
1
原创 [加餐]指针和动态内存管理 以及【加餐】使⽤指针实现链表
编译器在每次编译代码时,给eg:变量分配的空间位置不一定跟上次一样。X64环境下的地址较长 X86环境下的地址较短。默认情况下,堆区的空间都需要手动申请和释放。随着数组下标的增长,地址是由低到高变化的。每个字节都有其对应的地址。地址之间也可以比大小。
2025-02-05 11:21:40
449
1
原创 结构体和类
在C++中,当你在一个类的成员函数中访问该类的成员变量时,可以直接使用成员变量的名称(加上eg:Stu.也没问题),而不需要通过结构体或类的实例来访问。使用引用作为运算符重载的参数可以避免拷贝、支持修改操作数、操作非拷贝对象,并保持代码一致性,返回引用则直接操作原对象,效率更高。仅用于定义结构体,是一种纯粹的数据集合,没有成员函数、访问控制等面向对象的特性。C++中struct既可以是结构体,也可以是类,所以用法更多。<<输出运算符能够直接打印C++已有的类型的变量,自己的自定义的类型不行。
2025-02-04 16:35:45
696
1
原创 位运算和操作符属性
如果if碰到其他进制的话,其他进制中有一个1或者即以上都为真(其实和十进制一样)eg:2进制转换为32进制则''每5个2进制位转化成一个32进制位...''除了课件中提到的那几种应用,其他时候一般先不考虑用这个原反补码。int类型的原码,反码,补码都是32位(因为占4个比特位)有符号整数的补码变成原码先看符号位来判断用哪种方法变。关于优先级:(优先级可以不用记,用括号来绑定就行了)移位操作符移动的是储存在内存中的补码的二进制序列。正数或者无符号数左移一位有乘二的效果。正数右移一位有除二的效果。
2025-02-03 17:20:31
615
原创 函数与递归
能用循环时用循环不用迭代,除非用循环很复杂和明显是递归问题的才考虑用迭代,但要考虑迭代时会不会出现栈溢出。函数重载解决了大致功能相同,参数不同的函数名字不同而不好记的问题。reverse的最后面那个参数要指向想翻转的末尾序列的后一位。重载函数->编译器会根据传递的参数来自动推导应该用哪个函数。函数对全局变量做出的改变还是不会随着函数结束而消失的。声明或者定义应该在使用之前(不单单针对于函数)函数声明在main函数里面也是可以的。引用变量和引用实体的变化是一样的。传址调用比传值调用效率高。
2025-02-02 18:15:20
622
1
原创 C_C++输入输出
字典序是根据字符在字母表中的顺序来比较和排列字符串的(字典序的大小就是字符串的大小)1.一次循环决定打印几行,一次循环决定打印几项。整数和char类型的单字符可以比较大小。cin是>> cout是<<如果输出整数的话 000要整成0。
2025-02-01 17:31:29
372
1
原创 string和数据结构、算法与STL
string& 是 C++ 中的引用类型,表示对字符串( string )的引用.C语言中一整个字符串是用字符数组才能表示出来,不能char s = "abcd";用string类型的字符串来存储字符串的话可以不关心空间,因为它会自动扩容。C和C++中的内置类型(比如:long)一定满足所有同类型的关系运算。getline在C语言和C++中的用法不一样,头文件也不一样。一般可以带的出去的才是输出型参数,比如:指针。遍历字符串可以用:下标,范围for,迭代器。而像string这种就不一定。
2025-01-27 21:41:53
888
1
原创 数组和单链表专题
栈区的空间很有限,静态区的空间大些,一般在静态区去申请较大的空间考虑特例能不能归并到一起也很重要在二维数组中,基于范围的 for 循环直接遍历的是行,而不是单个元素对于一个 int arr[3][4] 的二维数组, memset 会首先填充 arr[0][0] 到 arr[0][3]如果将数组定义为全局变量,其元素会被默认初始化为0设置变量名时,一般取单词的前三个字母作为变量名地址是常量整型和字符型变量在比较大小的时候,字符型变量会被提升为整型(对应的ASCII值)
2025-01-25 21:45:16
328
1
原创 条件判断与循环
在scanf中:4表示 如果输入的字符少于4个, scanf 会停止读取并返回。如果输入的字符多于4个, scanf 只会读取前4个字符,并将它们转换为整数。在printf中:4表示 如果整数的位数小于4位,它将在前面填充空格以占据4个字符的宽度。如果整数的位数大于或等于4位,它将按实际位数输出,不会截断。有符号的数跟无符号的数比大小的话,会把有符号的数也转化为无符号的数,这个时候的结果可能就会有偏差。如果题目没有明确说明要按题目这个过程去写的话,可以手动简化算术的步骤。字符也是整型家族的成员。
2025-01-21 18:24:20
490
3
原创 C++入门
总结C和C++的不同点,一样且牢记的在课件里面一般不画出,C语言中没勾的自己一般也会再勾一次,不好看出不是通用的,要额外标注。以char类型打印的是打印的他的ASCII值对应的字符(charb='A'和charb=97是一样的)说明中说:对于100%的数据,输入的整数在[1,109]内--指的是题目测试时输入的数在这个范围内。编译失败给的原因是有有游离的...时,大概率是因为该用英文的地方用成了中文(比如;数的范围很大则一般用longlong类型来搞(longlong也是整数)
2025-01-18 21:05:01
334
1
原创 文件操作
fgets如果读取成功的话,返回的是目标空间的起始地址(str的),读取失败的话,会返回NULL。fscanf/fprintf -- 针对所有输入流/输出流 的格式化 输入/输出函数。用二进制的方式通过程序写到文本中,文本读不懂,但是把它放回原来的地方也可以用。scanf/printf--针对标准输入/输出流的 格式化 输入/输出函数。用fopen打开文件时,如果打开成功,返回的是有效的指针。fgetc在读取正常时,返回读取到的字符的ASCII值。二进制文件通过文本编辑打开时,是不行的。
2024-12-16 17:55:06
353
原创 自定义类型:结构体
offsetof是一个宏,可以计算结构体成员相较于结构体变量起始位置的偏移量。编译器会把两个匿名结构体类型当做俩个不同的类型来处理。结构体的成员在内存中是存在对齐现象的。结构体的关键字是struct。联合体的关键字是union。枚举的关键字是enum。eg:1不是4的倍数。
2024-12-08 20:41:34
312
原创 内存函数
强制类型转换只是临时的 比如:(char * *)dest++是不会按照char所占字节个数来+1的(这时候甚至会报错) 就算++放在前面,在有些编译器上也不行 但可以写为dest=(char ** )dest+1。C语言规定memcpy只要可以实现不重叠的拷贝就行了,但是VS上的memcpy可以实现重叠的拷贝,其他编译器不一定可以(memmove可以完全替代memcpy,自己用memmove)把一个受限制的地址交给一个不受限制的地址时,编译器会报警告。
2024-12-02 12:15:43
185
原创 字符函数和字符串函数
判断句变为strlen("abc")>strlen("abcdef") 或者给strlen的这两个强制类型转换成int类型的。这样写是不行的,因为减了后等于负3,但是又是无符号整数,所以直接用补码来换算成无符号整数,因此结果是一个很大的整数。把一个受限制的地址交给一个不受限制的地址时,编译器会报警告。VS用指令打开文件所用的文件名是扩展文件名后的文件名。字符串相关的函数的头文件都是<string.h>两个无符号整数算出来的值还是无符号整数。\0在条件判断中,认为是0。
2024-12-02 12:14:51
312
原创 深入理解指针(5)
比如:在printf中-4的打印 用%d打印时,会将补码转换成原码再转化为10进制打印出来 用%p打印时,因为地址是无符号整数,所以直接把补码按照16进制打印出来(补码的每四个数看做2进制,用此变为16进制)未说明时,问是多少个字节,则答在X86环境(即32位的)下的(比如:问int类型占多少个字节)p为地址时,p[i]和*(p+i)一般在何时何地均等价。地址的长度也是4个或8个字节(看是X64还是X86)%s打印字符串时,需要的就是地址来去打印。C语言中,一个字符占用一个字节。
2024-12-02 12:14:03
138
原创 深入理解指针(4)
strcmp比较的不是字符串长度,而是对应位上字符ASCII值得大小(比如abcdef比abcq小)两个字符串比较大小不能使用> >= <= < ++!=,应该使用strcmp。qsort函数是用来对数据进行排序的,对任意类型的数据都可以排序。qsort的头文件是<stdlib.h>qsort是C语言中的一种库函数。用冒泡排序来给任意类型的数据排序。-> 结构体指针->成员名。. 结构体变量.成员名。
2024-12-02 12:12:55
152
原创 深入理解指针(2)和(3)
一维数组传参时,设计的函数的参数可以写成数组,也可以写成指针。不管是一维数组还是二维数组,形参可以写成数组,也可以写成指针。*(arr+i)等于arr[i ],不是值,是地址。区分移动下标(p+i)和移动指针(p++)&函数名和函数名都是函数的地址,没有区别。二维数组的数组名就是它第一行的地址。简记:看conat在*左边还是右边。区分指针 指针的值 指针的地址。二维数组的首元素就是它的第一行。在一维数组中则是地址。
2024-12-02 12:12:10
194
原创 深入理解指针(1)
指针-指针的绝对值是指针和指针之间的元素个数(包含减数那个元素){指针减去指针,如果是大地址减去小地址则为正,反之则为负}放在*左边,限制的是指针指向的内容,也就是不能通过指针变量来修改它所指向的内容,但是指针变量本身是可以改变的。放在*右边,限制的是指针变量本身,指针不能改变他的指向,但是可以通过指针变量修改它所指向的内容。未初始化时,指针变量里面存的值是随机的(是随机的地址,这是解引用操作符就会形成非法访问)p为指针变量时,&p取得的是指针变量的地址,而不是指针变量指向的值得地址。
2024-12-02 12:08:26
605
1
原创 操作符详解
a+=1的记忆方法:把左边的用小括号阔起来移到后边的最左边,右边算出来的值就是a。右移到底是采用算术右移还是逻辑右移是取决于编译器的,编译器通常是采用算术右移。变量的名字仅仅是给程序员看的,编译器不看名字,编译器是通过地址找内存单元的。|(对应的二进制位只要有1,就是1;两个同时为0,才是0)n&(n-1)之后可以把n的二进制位的最右边的1变成0。&(对应的二进制位两个都是1,才是1;算数转换:讨论的是类型大于等于整形类型的那些类型。^(对应的二进制位相同为0,不同为1)计算机里的运算都是用的补码!
2024-12-02 12:07:27
292
原创 函数栈帧的创建和销毁和函数递归
在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。一个字在16位里面是两个字节,在32位里面是4个字节,在64位里面是8个字节。(push)压栈:给栈顶(即已有的所有元素之上)放一个元素。(pop)出栈:从栈顶删除一个元素。函数的形参是放在main的栈帧里的。向下是加,向下是减(?寄存器是集成到CPU上的。区分硬盘,内存和寄存器。
2024-12-01 22:48:42
196
原创 函数和数组(C语言)
写为比如 int add(int , int)(即 函数定义时,形参变量名可以省略,形参类型不可以省略)函数声明时,形参变量名和函数定义时不一样也行,但是形参的类型要一致(参数类型的位置也要一致)没有加特殊东西时,自定义函数里不能使用main函数里面的局部变量,但是可以使用全局变量。传值调用时:当实参传递给形参时,形参是实参的一份临时拷贝,对形参的修改不会影响实参。自定义函数没有参数时,可以在定义和声明时,()里面一会有void,一会没有、数组在传参的时候,实参就写数组名就行,形式也是数组的形式。
2024-12-01 22:43:37
233
原创 条件和循环语句和VS的一些使用技巧
for循环的表达式1.2.3均可以省略,表达式2如果省略了,就默认表达式2是正确的 但是for循环的分号不能省略。if和else配对问题:先看有花括号的,再看没有花括号的配对(else总是与前面与其最近的未配对的if配对)while(num--)//是先用num还没减的数去判断,再--,这里就算是num刚开始就等于0了,也会--dowhile是直到型(先循环,再判断)(符合while中的条件就循环)(之前记错了)while循环是当型(先判断,再循环))这里是符合while中的就进行循环)
2024-12-01 22:38:53
229
原创 前期学习遇到的一些问题和总结
编写程序exp5_6.c,请判断花瓶是谁打碎的。教师花瓶碎了,班级只有四个小同学,老师询问小同学,已知是其中1人打碎的,还知道4人中每个人要么是诚实的,要么总是说谎的。小同学回答老师的问题是: 甲说:“乙没有打碎,是丁打碎的。” 乙说:“我没有打碎,是丙打碎的。” 丙说:“甲没有打碎,是乙打碎的。” 丁说:“我没有打碎。” 根据四人回答判断谁打碎了花瓶。//对sum初始化为0,对average定义。}(自定义函数定义举例)
2024-11-10 11:32:57
135
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人