下一周任务:每天10-15题, 一周内把gesp一级全答完,对应的编程题在洛谷上提交 0~9 48~57 A~Z 65~90 a~z 97~122 数组: 1、数组的长度,一旦创建不能修改 2、数组的数据,在内存中是物理连续存放 3、数组的名字,代表数组的第一个元素的地址 数组的创建 int n; cin>>n; int a[n];//将变量当成了长度,不报错,但是理论错误 创建时遵循两个原则: 1、多创建一些空间+50,写算法方便。 2、创建的数组空间不大于1000w,防止内存超限,防止时间超时。 以下创建数组的方案均可 #define N 10050 int a[N]; int a[10050]; cout<<a;//输出的是 0x235677 cout<<&a[0];//输出的是 0x235677 //下标默认是从0开始的,我们人类赋予的 for(int i=0;i<n;i++) cin>>a[i]; [] 是数组重载了[]符号的功能,创建时代表长度,使用时代表下标 创建并初始化 {} 初始化赋值 int a[10]; a[10]={135};//报错 int a[10]={1,2};//如果不够,补零,如果超数量,报错 //1200000000 int a[5]={};//00000 int a[]={1,2,3};//123 默认长度为3 二维 int a[][]; 本质上,二维数组是多个一维数组连接在一起的存储结构,所以 二维数组可以当一维用,一维也可以当二维用 二维数组:a[N][M] b[N*M] b[k]->a[k/M(+1)][K%M] a[i][j]->b[i*M+j] 二维数组的题型,题型末尾范围:1<=n*m<=1000000 int a[1000050]; int n,m; cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i*m+j]; } } 数组下标的用法: 1、移位:存数据去数据不一定从0开始 2、特殊含义:当成月份/时间/ascii int a[13]={0,31,28,31,30...}; 3、当成数据:素数筛算法、桶排序(计数排序) 输入数据后,要求排序并去重 int n; cin>>n; //将数组范围与数据范围一致,与数据数量无关 int a[100050]={},b; //for(int i=0;i<n;i++) while(n--){ cin>>b; a[b]++;//b这个数据新增1 } //顺序已经有序 for(int i=0;i<100050;i++){ if(a[i]) cout<<i<<" ";//从小到大排序并去重 while(a[i]--) cout<<i<<" ";//从小到大排序不去重 } 空间换时间:计数排序 使用限制: 1、数据范围过大 2、下标能够表示的数据 数据范围包含负数[-100000~100000] int a[200050]={}; cin>>b; a[b+100000]++;//数据移位 cout<<i-100000;//数据移位 数据类型是字符型 int a[150]={}; char c; cin>>c; a[c]++; putchar(i); 字符数组: 1、明白字符数组的原理 2、字符数组与数组与字符串的区别 3、字符数组函数的用法 c语言中的字符串 char c[]="hello"; 默认长度是6 结尾包含'\0' char c[6]={'h','e','l','l','o','\0}; 访问数据修改数据,通过下标,从0开始,与普通数组一致 数组名代表整体 char c[]="hello"; cout<<c;//hello 字符数组可以通过下标拆分,也可以当成字符串整体输出 cin.getline(c,100);//一直读取一整行,直到遇到'\n'或到最大长度 获取长度 strlen(c); 复制内容 char a[10]="hello"; char b[10]; strcpy(b,a);//将a中的内容拷贝到b 连接 strcat(a,b);//将b连接到a末尾 比较 strcmp(a,b);//从头到尾依次比较ascii直到分出大小,返回int 返回0一样大,返回正数前大,返回负数后大。 char a[3]={'a','b','c'}; char b[3]={'a','b','c'}; strcmp(a,b);//不确定答案 比数组外内存后面的数据,直到分出大小或同时遇到'\0' 查找 char c[]="hello"; char *p=strchr(c,'o');//在c中找o,返回指针 strstr找字符串 cout<<*p;//o cout<<p;//0x34aa44 字符串 字符串是独立的类型,不属于基本数据类型 字符串包含很多成员函数,通过.调用自身的函数 字符串包含数组的用法,可以通过下标访问修改元素 字符串重写了比较运算符和+ 字符串可以直接比较大小,原理是比较ascii 字符串可以通过+连接字符串或字符 cin>>s;//无空格输入 getline(cin,s);//可以有空格的输入 cout<<s; string s; string s="hello"; string s2(s);//复制初始化 string s(10,'a');//初始化为10个a组成的字符串 相关函数 s.size() 长度 s.length() 长度 s.empty() 返回true代表空,返回false代表不空 s[5]或s.at(5) 访问下标对应元素 string s2=s.substr(5) 从5下标开始截取,截取到最后 string s2=s.substr(5,8) 从5下标开始截取,截取8位 s.find("a"); 查找a的位置,返回下标(如果没找到,返回unsigned long long 最大值) if(s.find("a")>=s.size()) 没找到 else 找到了 int d=s.find("a");//如果没找到,赋值成-1 if(d>=0) 找到 else 没找到 s.find("a",5);//从5下标开始找a的位置 s.rfind("a");//从后往前找a的位置 + += append() 表示连接 s=s+b; s+=b; 不常用函数 s.compare(s1);比较 s.insert(p,'k');//在p地址插入一个字符k,速度特别慢 s.erase(p);//通过地址删除,速度特别慢 有一句话,通过空格拆分成多个单词 string s="i love beijing"; 通过字符串流进行拆分 <sstream> istringstream k(s); string str; while(k>>str){ cout<<str;//通过空格自然拆分成多个字符串str } 数学函数: abs 绝对值 mod 取余取模 ceil 向上取整 1.1 -> 2 floor 向下取整 1.9 -> 1 round 四舍五入 cout<<log2(128);//7 求以2为底128的对数 对数函数 cout<<log10(100);//2 对数函数一共有4个,分别为log,log2,log10,log1p,没有别的了 pow 幂函数,返回值是double sqrt 平方根,返回值是double cbrt 立方根,返回值是double hypot(x,y) 勾股求斜边 相当于sqrt(x*x+y*y) sin,cos,tan 这些三角函数在c++中全都有 最大公约数 gcd c++17版本新增函数 最小公倍数 lcm c++17版本新增函数 <numeric> 随机数 <cstdlib> srand() rand() srand 设置随机种子 rand 生成随机数 <ctime> time() int main(){ srand(time(0));//随机数通过时间生成 cout<<rand();//0~RAND_MAX 最大值不同的电脑有差异 //控制生产的范围 a~b cout<<rand()%(b-a+1)+a; //0-100 cout<<rand()%(100-0+1)+0; } //自定义函数 自定义类型 函数的结构:返回值类型,函数名,参数,函数体 swap(a,b); 交换,没有返回值 cout<<swap(a,b);//报错 min(a,b); 求最小值,返回最小值 有返回值,函数类型与返回值类型要一致 没返回值,函数类型是void 内置函数:一些自带的函数 + 类型转换 标准库函数:功能广泛,有划分,需要导入头文件 成员函数:类或结构体内的一部分,需要类对象调用的函数 构造函数:初始化对象时,调用的函数 还其他的,如:虚函数,内联函数,lambda函数等。。 语法格式 类型 名(参数,参数){ //函数体 return xx; } 使用函数: 1、注意调用时的权限 #include <iostream> using namespace std; struct student{ int add2(int a,int b){ return a+b; } }; int add1(int a,int b){ return a+b; } int main(){ add1(1,2); student s; s.add2(1,2); return 0; } 2、调用函数时,参数的类型、数量、顺序要与创建函数保持一致 函数的重名用法(多态) int max(int a,int b,int c){ return max(max(a,b),c); } int max(int a,int b,int c,int d){ return max(max(a,b),max(c,d)); } int main(){ cout<<max(1,2);//调用的是自带的 cout<<max(1,2,3);//调用自定义的 } 形参:定义函数的参数、实参:调用函数传递的值 传参的方式:值传递,引用传递 void swap1(int a,int b){ int t=a; a=b; b=t; } void swap2(int &a,int &b){ int t=a; a=b; b=t; } int main(){ int a=5,b=10; swap1(a,b);//值传递 cout<<a<<b;//5 10 swap2(a,b);//引用传递:控制原数据的值 cout<<a<<b;//10 5 } 递归函数:在函数内部调用自己 使用时,需要有明确的停止条件,防止无限递归 优点: 1、代码简洁, 2、容易理解, 3、自我管理良好 缺点: 1、空间复杂度高,容易栈内存溢出 2、时间复杂度较高,一分多结构 3、调试困难 递归函数的类型题:斐波那契数列,爬楼梯,汉诺塔,全排列 (责任编辑:admin) |