待解决:
- 大数加减法??
*p ++
和*(p++)
又搞不清楚了。。。- 全排列算法? 蓝桥杯带分数那题 以及之前总结的模板 stl库很可能不能用所以要自己会写
- 文件操作
- 树状数组 小朋友排队那题
- 什么是匈牙利算法
- hash函数
之前写的几个机试专题:
之前整理的两个蓝桥杯blog:
几个常用模板:
-
dfs模板:把蓝桥杯那个专题的题多敲几遍就ok
注意点整理:
- 多位数时候要注意首位不能为0,若每位数互不相等时不要漏掉,遇到除法要换成乘法。
- 时刻考虑数据溢出、不在范围内、输出格式等细节问题。
- 非静态成员变量不能在类外初始化
- 不允许使用数据成员初始值设定项
原因如下:https://blog.csdn.net/misayaaaaa/article/details/61195389 - 超时可以把cin/cout缓存scanf/printf,读取字符串用str。c_str();
- 按固定格式输出年月日:
printf("%04d-%02d-%02d\n",y,m,d);
- 用 sizeof求int数组长度:
int getArrayLength(T arr[]) {
int length = sizeof(arr)/sizeof(T);
return length;
}
- C++中 swap函数记得引用
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
-
C++格式输出控制:setprecision(n)与setiosflags(ios::fixed)或者setiosflags(ios_base::fixed)合用,可以控制小数点右边的数字个数
-
1,memset函数
按照字节填充某字符
在头文件< cstring >里面
2,fill函数
按照单元赋值,将一个区间的元素都赋同一个值
在头文件< algorithm>里面 -
得记住各种算法/排序算法的时间/空间复杂度
-
for(auto &c:s)与for(auto c:s)
#include<iostream>
using namespace std;
int main()
{
string s("hello world");
for(auto c:s)
c='t';
cout<<s<<endl;//结果为hello world
for(auto &c:s)
c='t';
cout<<s<<endl; //结果为ttttttttttt
- transform函数
#include <iostream>
#include <algorithm>
using namespace std;
char op(char ch)
{
if(ch>='A'&&ch<='Z')
return ch+32;
else
return ch;
}
int main()
{
string first,second;
cin>>first;
second.resize(first.size());
transform(first.begin(),first.end(),second.begin(),op);
cout<<second<<endl;
return 0;
}
- isalnum():string中至少有一个字符,而且全是字母或者数字或者是字母和数字混合返回True,其他情况返回False:
isalpha():string中至少有一个字符,而且全为字母,返回True,其他情况返回False。 - 无序集是不按特定顺序存储唯一元素的容器,它允许根据单个元素的值快速检索单个元素。在unordered_set中,元素的值同时是其键,它唯一地标识它。键是不可变的,因此,unordered_set中的元素不能在容器中修改一次 - 但是可以插入和删除它们。
字符串/字符数组相关知识点
- 不能用C++的cin输入string,要加上
#include <string>
之后用getline(cin,input_string);
- 字符串长度是
str.length()
或者str.size()
- char既可以定义字符串也可以定义字符
char 定义的字符数组
char b[]={'h','e','l','l','o'};//声明字符数组,长度为5
char定义字符串
字符串的优势在于输入、输出和赋初值,输入输出不需要使用循坏。字符数组需要用循环依次输出每个字符。
char b[]="hello";//定义字符串
char *p = b;
cout << b;//输出的是hello
cout<< *p;//指针指向首地址,所以输出为 h
- 字符串的长度是字符数目加1,因为包含了\0结束符,而字符数组的长度就是字符的数目。
- 对于字符数组可以通过sizeof求出其长度,但是对于字符串是其长度加上1。因此这个长度没有意义,为此C++可以用strlen求出字符串的有效内容的长度(不含字符串结束标识\0)。
- 这里需要特别注意的是string并不是一个关键字,而是一个类。 下面代码的指针指向的是对象,而不是string中的第一个字符。
string str="hello world";
string *p1 = &str; //注意必须加取地址运算符 &
cout << str << "," << *p1; //输出的是 hello world,hello world
-
1 如果想访问string定义字符串中的每个字符,可以使用 str[i]
2 cout<<p1[0];//输出的是 hello world
3 不可像char定义的字符串那样使用p1[i],在string中,i>0并未分配指针,这种理解方式本来就错误。 -
在C/C++中常用的获取字符串长度或者字符串数组长度的函数有:
size()、length()、strlen()、sizeof()
字符串长度:strlen(str)、str.length()、str.size()
str.length()和str.size()是用于求string类对象的成员函数,求得的是实际的字符串长度;
strlen(str) 是用于求实际字符串数组的长度,其参数是char*,头文件为string.h。
sizeof用于求得的为字符串长度+1.对于字符数组,strlen()和sizeof()求得的结果相同. -
strlen不区分是数组还是指针,就读到\0为止返回长度。而且strlen是不把\0计入字符串的长度的
-
vector头文件的push_back函数,在vector类中作用为在vector尾部加入一个数据。
string中的push_back函数,作用是字符串之后插入一个字符。 -
字符数组提取最后一个字母要减去‘0’
s[len-1]-'0'
-
字符串带空格输入 用
getline(cin , s1);
-
将数字转换成字符串
#include<string>
,to_string
函数 -
c_str() 以 char* 形式传回 string 内含字符串
如果一个函数要求char*参数,可以使用c_str()方法:
string s = “Hello World!”;
printf("%s", s.c_str()); //输出 “Hello World!”
参考:
sort排序用法
#include <algorithm>
用法:Sort(起始地址,结束地址,排序方法),其中第三个参数可以不写,默认升序。sort(num,num+N,cmp);
#include <functional>
greater表示内置类型从大到小排序,less表示内置类型从小到大排序。sort(a,a+10,greater<int>());//快速排序
- 字符串相关,字符串的复制,连接,比较大小
#include <string.h>中直接可以使用的字符串操作函数: strcpy、strcmp、 strcat、strlen
# include<stdio.h>
#include<string.h>
int main()
{
char str1[11]="Hello";
char str2[11]=" World";
char str3[11];
int length;
strcpy(str3,str1);
printf("复制后的字符串:%s\n",str3);
strcat(str1,str2);
printf("连接后的字符串:%s\n",str1);
length=strlen(str1);
printf("连接后的字符串长度:%d\n",length);
return 0;
}
//自己编
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
//字符串长度
int mystrlen(const char* str)//const?
{
if(str==NULL)
return -1;
int len=0;
while(*str++!='/0')
{
len++;
}
return len;
}
//从strSrc复制到strDest
//其中strDest长度要大于strSrc的长度
char* mystrcpy(char* strDest, const char* strSrc)
{
if(strDest==NULL || strSrc==NULL)
return NULL;
if(strDest==strSrc)//考虑要周到
return strDest;
char *tmp=strDest;
while((*strDest++=*strSrc++)!='/0');
return tmp;
}
//连接两个字符串
char* myStrcat(char *str1,char *str2)
{
int len1=strlen(str1);
int len2=strlen(str2);
for(int i=0;i<len2;i++)
{
str1[len1+i]=str2[i];
}
str1[len1+len2]='/0';//一定记得最后一个加上/0
return str1;
}
int main()
{
char *q="abcdefg";
//strcpy_s(q,sizeof("123456"),"123456");
printf("%d\n",mystrlen(q));
printf("%d\n",strlen(q));
return 0;
}
STL库
vector
-
声明:
vector<int> a
可用a[i]直接访问
a.push_back()
a.pop_back()
只能在尾端
a.size()
a.clear()
只会清数据,内存还在占用,所以可以用vector<int>().swap(v)
-
vector也可以数据类型时自定义的结构体。
-
快速构造 10个1的vector数组
int n=10;
vector<int> vect(n,1); //第2个数字不屑的话默认为0.
- 二维:
vector<vector<int>> vect2
可直接用vect2[i][j]
但是要先一维一维的初始化
int n=5;
vector<vector<int> > vec2;
for(int i=0;i<n;i++)
{
vector<int> x(i+1,1);
vec2.push_back(x);
}
for(int i=0;i<n;j++)
for(int j=0;j<vec2[i].size;i++){}
set
集合不会出现重复元素
- 构造
set<T> s
- 遍历元素:迭代器
set<T>::iterator it
起始begin
尾后end
#include<set>
#include<string>
set <string> c;
for(set<string>::iterator it=c.begin();it!=c.end();it++)
{cout<<*it;}//不要用小于 set内部不一定连续
- set也可结合结构体使用,一定要重载
- 重载‘<’运算符:
struct Node{
int x, y;
bool operator < (const Node &rhs) const {
if(x==rhs.x){//x相等的话 按y排 不然用x排
return y<rhs.y;
}else{
return x<rhs.x;
}
}
}
映射表map
关键字集合(key),班级集合(value),只能从key找value。key唯一。
在C++中遍历map是按照关键字从小到大遍历的,这一点和set相同
map <T1,T2>
m; 名为m的T1到T2的映射insert()
的时候一定要成对的- 利用
make_pair(v1,v2)
插入,若key映射已存在,第二次映射即使t2不同也不会更新
- 更改映射值
dict["Tom"]=3;
dict["tom"].count()
存在返回1,不存在返回0- 可以用迭代器中
it->first
或者(*it).first
找key,second找value clear()
清空,结构体也是要重载小于号的
isdigit()
用来判断是否是0-9之间的数字,是就则返回true,否则返回null(0),头文件为#include<ctype.h>
#include<math.h>
pow() 函数用来求 x 的 y 次幂(次方),其原型为:double pow(double x, double y);#include <cctype>
(C语言使用<ctype.h>
)isalpha()
判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,在标准c中相当于使用“isupper(ch)||islower(ch)”做测试,返回非零值(不一定是1),否则返回零。isupper()
判断是否是大写字母。
队列
- 构造队列:
queue<T> q
- 存入队列用
push()
出队pop()
- 输出队首元素用
front()
- 操作前一半要检测是否为空
empty()
- 队列没有
clear()
广度优先搜索
相当于一层层搜,需要用队列辅助实现。搜最短的一般用bfs,要定义结构体存储状态信息
- 初始时把起点放到队列中,并标记起点访问。
- 如果队列不为空,从队列中取出一个元素x,否则算法结束
- 访问和x相连的所有点v,弱国v没有被访问,把v入队,并标记已经访问。
- 重复步骤2
栈 Stack
C++标准库中的Stack
#include <stack>
stack<T>
方法 | 功能 | 参数类型 | 返回值类型 |
---|---|---|---|
push | 压入元素 | T类型 | / |
pop | 弹出元素 | / | / |
top | 返回栈顶元素 | / | T类型 |
empty | 栈是否为空 | / | bool类型 true表示空 |
size | 栈的元素个数 | / | 非负整数 |
动态规划
- 把多阶段决策问题变换为一系列互相联系的但阶段问题,找最优化解。
最优化原理:当前状态时最优的情况下,下一步才可能继续最优的。就是说每一个最优策略的子策略也时最优的。
无后效性:如果某阶段状态给定以后,则在这个阶段以后的发展不受以前阶段各状态的影响。
错排公式
f[n]=(f[n-1]+f[n-2])*(n-1);