• 机试算法——基本知识


    优秀的代码风格

    1.函数形参定义为下划线+实参
    #数据类型
    int 是四个字节(byte),-2 ^ 31~2 ^ 31-1
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YPwd45c-1659315467383)( https://img-blog.csdnimg.cn/5292af37e0124ab2844950bfc3e3935a.png )]
    ##类型转换
    整型变量属性给布尔变量时会自动转换为true(非0或false(0)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KLnj0FKl-1659315467383)( https://img-blog.csdnimg.cn/02c30b281d704e52b3703e3284a196c1.png )]
    显示转换语法如下:
    int a = 5;
    fload b = (float) a;
    隐式转换:会默认把精度低的转化为精度高的

    #输入输出
    输入规模大于10的五次方用scanf
    ##扫描
    基本格式
    cpp scanf ( "格式控制" , "变量地址" )

    -char数字整个输入的情况下不加&之外的变量类型必须加&;因为命名元素代表除了提供了其他第一个的​​地址
    cpp字符str [ 10 ] ; scanf ( "%s" , str ) ;

    -它们的双引号转换内容是整个输入,只是把数据的格式符字符的地址写在后面输入:13:45:20

    cpp int hh , mm , ss ; scanf ( "%d:%d:%d" , & hh , & mm , & ss ) ;

    -使用%c读入字符会读入空格,而cin自动过滤空格-

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来上传(img-bSDgf8JD-1659315469115)(https://img-blog.csdnimg.cn/da8dea2afc5541bd815d6e71ef3b33a2.png)] ##打印

    注意:使用printf时最好添加头文件#include

    (1) int:%d (2) float: %f, 默认保留6位小数(3) double: %lf,默认保留6位小数(4) char: %c, 回车也是一个字符,用’\ n’表示

    注意:不能用printf直接输出字符串,需要写成:printf(“%s”, s.c_str());

    输出格式 (1)Float, double 输出保留多位小数时用:%4f, 0.3 (2) 最小数字宽度

    • %8f, 表示这个保留数字当3位补缺3位时的最小宽度为8位 。在后面补上空格 - %08.3f,表示最小时宽度为8,保留3位小数,当填充不足时在前面补上

    ##循环

    • while(cin>>n,n<=0) 里面可以输入多条语句,执行是从左到右执行,返回值是最后一个

    #文字
    ##字符排序

    读入题词>如果必须要一个输入字符串,如果没有使用字符串,可以输入比较大的字符串

    1.字符串就是字符长度要加注’\0’ 可以使用因此来的字体的字体。多重字符串的长度多1!
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iGAukPZN-1659315469116)( https://img-blog.csdnimg.cn/225e1224564f46018c878c21a09d47a0.png )]
    2. 输入输出
    - 使用cin/cout输入输出,输入时遇到空格或者回车就会停止,但输出不会;
    - 使用scanf(“%s”,str)读字符数组时不能取地址
    - cin遇到回车空格才停止,如何读入一行字符串: fgets(s,100,stdin);最多读入100个字符,从stdin文件读入;
    - cin :getline(cin,s)//s是string变量
    - string数据类型只能用cin读

    字符数组的常用操作

    下面几个函数需要引入头文件:
    #include

    (1) strlen(str),求字符串的长度
    (2) strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
    (3) strcpy(a, b),将字符串b复制给从a开始的字符数组。

    标准库类型string

    可变长的字符序列,比字符数组更加好用。需要引入头文件:
    #include < string>

    (4) string 的比较:
    支持 > < >= <= == !=等所有比较操作,按字典序进行比较。

    函数、指针

    • int f(int x)是传值,形变动不会影响实参;int f(int &x)就变成了传引用
    • 在函数中对数组中的值的修改,会影响函数外面的数组。
    • 引用:引用和指针类似,相当于给变量起了个别名。加引用可以提高效率在这里插入图片描述

    类与结构体

    类的举例

    • 类中的变量和函数被统一称为类的成员变量。
    • private后面的内容是私有成员变量,在类的外部不能访问;public后面的内容是公有成员变量,在类的外部可以访问。

    类的使用:

     
    
     
    
      
    
     
    
        
            
            
    
        
        
    
            
             
            
      
            } int set_age ( int a ) {             age = a ; } int get_age ( ) {返回年龄;}无效add_money (双x ) {+= x ; } } person_a , person_b ,[ 100 ] ; //一定要加分号int main ( ) {     Person c ;
            
             
            
    
            
            
             
            
                
            
        
             
            
    
            
    
    
     
    
    
        
        丙。名称=  “yxc” ;      // 正确!访问公有变量
        c . 年龄=  18// !错误访问私有属性
        c . 设置年龄(18 );           // 正确年龄( )是共有成员!setc . add_money ( 100 ) ;     丙。说( ) ;     cout << c . get_age ( ) << endl ; 返回0 ; } ```
    
        
    
     
        
         
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    结构体

    1.结构的定义 struct Nam{ //使用一些基本的一些数据结构或数据类型 }结构体变量;//必须有分号2.元素直接访问, 3.初始化,可以输入:scanf(“%d” ,&stu.id),有时使用构造函数更方便

    < br >结构体和类的作用是一样的。不同点的结构类默认是private,体默认是public。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4prQRSue-1660543832175)( https://img-blog.csdnimg.cn/f84b477c24b447989b5be3eed8a232ba.png )]

    • 结构体也有构造函数
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-virKa8RM-1660543832176)( https://img-blog.csdnimg.cn/0a52ffeb55914f39b859d775b3125d02.png )]
      结构体的自愿方式也可以使用一种形式——结构体中未初始化的变量为0 -

    常见错误

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7AIHzRTz-1660543832176)( https://img-blog.csdnimg.cn/b7f32c1738dc462288c4ba65d6384941.png )]

    如果读入的话,使用scanf尽量读入一个字符串;因为读入字符串,scanf会自动把空格、制字符、回车等发光掉掉,因此可以不用scanf等字符
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z72mjVWA-1659315468866)( https://img-blog.csdnimg.cn/7b8676e48aa04afe96241fd5069c3be2.png )]
    #时间复杂度
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R4EmDJPT-1659315468867)( https://img-blog.csdnimg.cn/693793364c9f4749b0ff25e5b3443302.png )]
    ~i 等价于i>=0

    STL

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DioXU7kj-1659315468867)( https://img-blog.csdnimg.cn/21cc1e7f368d4bfaa1d420c11f8c6e5e.png )]

    • size/empty
      size函数返回vector的实际长度(包含的元素个数),empty函数返回一个bool类型,表明vector是否为空。二者的时间复杂度都是O(1)。
      所有的STL容器都支持这两个方法,含义也相同,之后我们就不再重复给出。
    • 两个STL容器递归定义,>>之间要加空格,不然会当成移位操作
    • 所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n=a.size()。
    • 访问元素前记得要判断是否为空
    • 除了队列、栈没有clear函数,其他都有;清空重新定义一个就行
    • 除了vector和string之外的Stl容器都不支持*(it+1)的访问方式,只能枚举
    • vector和pair已经定义了大小比较规则,从第一位开始比较

    vector—— #include < vector>

    倍增思想:系统为某一个程序分配空间时,所需时间与空间大小无关,与申请次数有关;所以是刚开始给vector分配一个32的空间,如果长度不够了再分配一个大小为两倍的空间,然后将原空间数据复制过去。

    vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。

    1. 定义:
        vector<int> a(10,3);//长度为10,值都为3
     	vector<int> a;		相当于一个长度动态变化的int数组
    	vector<int> b[233];	相当于第一维长233,第二位长度动态变化的int数组
    	struct rec{};
    	vector<rec> c;		自定义的结构体类型也可以保存在vector中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. a.size()//所有容器都有

    2. a.empty()//空返回true

    3. clear() 清空

    4. push_back() 和 pop_back()
      a.push_back(x) 把元素x插入到vector a的尾部。
      b.pop_back() 删除vector a的最后一个元素。

    5. front/back
      front函数返回vector的第一个元素,等价于a.begin() 和 a[0]。
      back函数返回vector的最后一个元素,等价于
      ==a.end() 和 a[a.size() – 1]。
      7.erase(it)删除迭代器it处的元素(地址)
      erase(first,last)删除[first,last)区间里的元素

      从来没用过

    6. 迭代器(实际上绝大时候不会用)
      迭代器就像STL容器的“指针”,可以用星号“*”操作符解除引用。
      一个保存int的vector的迭代器声明方法为:
      vector::iterator it;
      vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。

      begin/end
      begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。
      所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n=a.size()。
      下面两份代码都遍历了vectora,并输出它的所有元素。

    vector<int>::iterator it;
    	it = a.begin();//初始化为a的第一个元素的地址
    	for(int i=0;i<a.size(;i++){
    		cout << *(it + 1) <<" ";
    	} 
    	
    	for (vector<int>::iterator it = a.begin(); it != a.end(); it ++) 
    		cout << *it << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    string:字符串

    c_str()

    2. queue,priority_queue—— #include < queue>

    头文件queue主要包括循环队列queue和优先队列priority_queue两个容器。

    声明
    	queue q;
    	struct rec{…}; queue q; 	//结构体rec中必须定义小于号
    	priority_queue q;		// 默认 大根堆
    	priority_queue, greater q;	// 小根堆
    	priority_queue>q;
    
    循环队列 queue
    	push 从队尾插入
    	pop 从队头弹出
    	front 返回队头元素
    	back 返回队尾元素
    
    优先队列 priority_queue
    	push 把元素插入堆
    	pop 删除堆顶元素
    	top 	查询堆顶元素(最大值)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    优先队列优先级定义细讲

    基本数据类型:

    • 大根堆:
    priority_queue<int> q;		// 默认大根堆
    priority_queue<int,vector<int>,less<int> > q 
    
    • 1
    • 2
    • 小根堆
    priority_queue<int, vector<int>, greater<int> > q;	// 小根堆
    
    • 1
    • 第二个参数是承载底层数据结构堆的容器,写vector就行了

    • 结构体优先级设置——重载
      小根堆只能重载大于号,大根堆只能重载小于号,写法参考下面的

    #include
    #include 
    using namespace std;
    const int N = 1e3+10;
    struct student{
    	string name;
    	int age;
    	int score;
    //	friend bool operator > (const student &stu1,const student &stu2){
    //	//优先队列中stu1>stu2的条件 
    //		if(stu1.score > stu2.score) return true;
    //		else if(stu1.score == stu2.score){
    //			if(stu1.name > stu2.name ){
    //				return true;
    //			}else if(stu1.name == stu2.name){
    //				return stu1.age >= stu2.age;
    //			}
    //		
    //		} else{
    //			return false;
    //		} 
    //	} 
    	//y总写法
    	 bool operator> (const student &stu) const{
    	//优先队列中stu1>stu2的条件 
    		if(score > stu.score) return true;
    		else if(score == stu.score){
    			if(name > stu.name ){
    				return true;
    			}else if(name == stu.name){
    				return age >= stu.age;
    			}
    		
    		} else{
    			return false;
    		} 
    	}  
    }stu;
    int main(){
    	priority_queue<student,vector<student>,greater<student> > q; //小根堆 
    	int n;
    	cin >> n;
    	for(int i=0;i<n;i++){
    		cin >> stu.name >> stu.age >> stu.score;
    		q.push(stu);
    	} 
    	
    	while(!q.empty()){
    		stu = q.top();
    		q.pop();
    		cout << stu.name<<" "<<stu.age <<" "<< stu.score<<endl;
    	}
    	
    
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    也可以像sort函数那样将对比函数写作结构体之外,详见算法笔记

    3. stack——#include < stack>

    头文件stack包含栈。声明和前面的容器类似。

    • push 向顶插件- pop 弹出栈顶元素- top() 获得元素栈顶

    ##双端队列——#include <双端队列>

    双端,既可以在队伍尾端弹出进入队伍,又可以在队伍尾端弹出队伍

    双端的组合队列是一个类似支持在队列中删除元素的连续线性存储空间。它只是向量和队列。 ;与queue相比,deque像目录一样支持所有访问。

    [] 随时访问begin/end,返回deque的头/尾push_back队头/队尾push_back 从队尾入队push_front 从队头入队pop_back 从队尾出元素队pop_front 从队出头队clear清空地

    set/multiset——#include

    头集和多重集是两个集合的主要组成部分,并且分别是可以包含多个元素的集合,并且分别是可以包含多个元素的集合。

    set和multiset的内部是一棵红黑树,它们支持的功能基本相同。

    声明

    ```cpp设置< int > s ;结构记录{ . . . } ; 设置 s ; // 结构体rec中必须定义号multiset < double > s ; 大小/空/清除等方法与类似访问器-set和multiset的只能称为“不支持访问星号”,“随时访问(*)解除,就是用过*来它取,支持” + +”和--“两个与它相关的操作。如果把++,它这里会算指“下一个”。“下一个”元素是指在从小大样本的结果中,排在下面的一个元素。”的寻找,是之前的一个元素。。(x)在类似的x的,并返回该使用集合)。不,如果,返回.end()。时间复杂度(x)=元素结束()来元素x中s.lower(x)的功能和该,发现这个不同的中两个条件,重复时间的复杂度。upbound(x)x的元素的使用工具的元素是元素(logn)时间顺序的复杂度为O(k + logn),返回复杂度为O(k + logn),elementx为elementx的数字。设置和1

    unordered_set/unordered_set_#include < unordered_set>

    与set类似,是无序的_set < int > s;//set unordered_set < int > s;// set unordered_set

    -lower_bound /upper_bound函数,其他一样##地图——#include <地图> map包含是一个键值对键值的映射,其内部实现是一集键为码键的树黑。map的和是可以的类型,其中定义名称,可以声明号,必须声明 map< key_type ,例如: map < key_type > 名称,long,bool>; map 散列; map, vector < int >>测试;size/empty/clear/begin/end均与set类似。 insert/erase与set类似,但其参数均是pair。示例:a.insert({“a” , 1 } ) 找到h。find(x)h中的map中查找键 例如为x的二元组。:a.find(“a”

    应用:是非常神奇的容器,可以用其他元素来做一个像样的东西

    unordered_map——#include < unorder_map >

    也是一个哈希表,与完全一样,好处就是地图效率更高,它的效率是O(1),只是不能二分一般用这个用的多

    ##对[外链转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVSrWJY9-1659315469648)(https://img-blog.csdnimg.cn/24111d27e57f43769d7423dc9881f2c8.png)]

    bitset——#include < bitset >

    做位的包含使用

    位集< 1000 >一个;一[0] = 1;

    #常用库函数——#include<算法>一些基础函数:max(),min(),abs(),swap(),都直接在这个库函数下,可以使用

    (1)reversen——左闭1开一个对向:reverse(a.be(),a.end()); 左右元素,在下标1~: (a + a + a + 1 + n); (2) 特殊的使用旧物去重后遗症的后遗症(或后遗症),即为后遗症的后遗症,即为后遗症的后遗症的后遗症。个数。

    一个对重: int m = unique(a.begin(), a.end()) –.begin(); 把一个菜去重,元素下标1~n:int m = unique(a + 1, a + 1 + n) - (a + 1);

    应用,去重归类中的元素

    _ _ _ _ (),一个结束。 _ _ _ _ bool cmp ( int a , int b ) //a是否应该排在b的前面,也就是返回a在b前面的条件{ return a > b ; 示例(a + 1 , a + 1 + n , cmp ); 可以写示例,直接为函数cmp的函数写一个“小号”的结构体也重载一个重体: cpp struct { int id , x , y ; 对向rec >一个;布尔&返回一个< ( const a , const rec b ) { x < b 。x || 一个。x == b 。x &&一个。y < b 。是;}示例(a.begin ( ) , a.end ( ) ) ; _ _ _ _

    (5)erfirst,last,last,last,uplowerfirst,中二分第3个搜索_:绑定的,在两个上使用,在两个不同的上(和指定)上的环境条件相同,有什么区别应该是唯一的要素,当然续续续续续续(指定好部分是提前寻找的顺序。

    在(剩余成分在下标)中大于1xn~的最小下标:I = lower_bounda 1, a +1 + an,.x –;

    在vector中查找小图x的最大(假设一定存在):int = *–upper_bound(a.begin(), a.end(), x);

    (6)fill(a,a+n,val)将一个容器或容器的[0,n)区间都为val;(7)next_permutation()提出一个序列在全排列中的下一个

  • 相关阅读:
    [SUCTF 2019]EasySQL1 题目分析与详解
    WorldView卫星遥感影像数据/米级分辨率遥感影像
    自己动手从零写桌面操作系统GrapeOS系列教程——23.从硬盘读取文件
    这几款抠图工具效果很好,朋友们不要错过
    JavaWeb学习4:jQuery的学习
    BI与ClickHouse:探索式BI的OLAP技术演进之路
    国产IDE如何获得捐赠和风险投资
    react-redux使用
    java计算机毕业设计疫情防控管理系统MyBatis+系统+LW文档+源码+调试部署
    PyTorch中DistributedDataParallel使用笔记
  • 原文地址:https://blog.csdn.net/qq_45768060/article/details/125989610