信息学C++ 主要信竞考点以及应对方法

这篇博客的话,大家可以参考,在2天时间里写的,主要搜集了一些知识点和资料,一半是我个人见解,有不全面的地方还望大家私信我,帮我提出问题,我会在以后的博文中更加注意,谢谢!

注:下面有附表,和字符串有关,很实用,可以参考一下

考点1

基本输入输出+分支

最简单的一部分,基本上分值占比很小,搞清分支顺序,控制编代码时间

考点2

循环(嵌套)

有点上强度了,就是知识点宽而浅,但是编起代码来就各种条条框框贼复杂,多刷题面复杂一点的题

考点3

数组

一维的话,考点主要是元素的操作(移动,删除等)以及排序,这类基本无脑sort,但可能会让你输出选择/冒泡的过程,那就得掌握这两个代码大致怎么写,桶的话用武之地不一定大,还有很重要的是查找,对于严格递增递减序列肯定要二分,不然就活该TLE,必须掌握二分,不是严格递增递减那就sort+二分,盲猜必考,二分用递归当然很好,死记硬背函数怎么写不一定不行qwq

二维数组

这个更恶心,基本就是考填数,角标发挥作用很大,简单一点的是杨辉,难一点的,输出这种:

1 2 4 7
3 5 8
6 9
10

这个你就好好想吧,把他关系搞清楚,边界就画图弄明白,接下来看你发挥了,数组范围开大点记得,RTE不好看

考点4

函数初步,结构体

如果要往难了考的的话,就是思维含量不高,纯叠复杂度,我不觉得有哪道题是非结构体不可的,写函数目的是降低主函数多次实现同一功能写代码的难度,别本末倒置了

考点5

递归

难度排名得第二,你不把递推式弄明白明年也做不出来,考察你数学能力的,这种题的话,自己多算几组找规律,实在不会递归想想循环行不行,但能用递归实现当然最好,汉诺塔必修,你能做对90%汉诺塔及其变式问题你就是递归概念神,反正核心是找递推式啦

考点6

字符串

第一次感觉信竞要背的也很多啊!把string所有函数用法全背出来就差不多了,下面附表为常用字符串函数(见附表),你知道和不知道里面涉及到的函数简直像在做两道题,我个人建议能用string就别用字符数组,总之这类型的掌握了方法就能做

考点7

高精度

这位才是难度榜第一,信竞萌新遇到的第一个大BOSS,只考加乘就很幸运,我就死记硬背好了,如果想靠理解那就是复现列竖式的过程了,控制下运行的用时

以下附表

附表:

字符串的声明和赋值

声明:string s;

输入的字符串在内存允许的范围内可以任意长。

可以输入中文。

读入:

不含空格的字符串 cin>>s;

包含空格、制表符等空白字符的字符串

getline(cin,s);

功能读入一个字符串s,读到换行符或EOF就结束

存储:长度为n的字符串s存储在s[0]~s[n-1],无其余字符。

输出:s=”China”;cout<<s;或者cout<<s[3];

例如:

string s;int c;

while(cin>>s)

c++;

//每次读入的单词放到s中,直到读入文件结束符//

可以给字符串变量赋值;

例如:s1=“abcde”; s2=s1;

不能对空的字符串变量的某一位置赋值(因为还不存在)。

但可以象数组一样改变某个已经存在的位置的值。

例如:

错误赋值:string a; for(i=1;i<=5;i++) s[i]=’a’;

正确赋值 s=“12345”;s[1]=b;cout<<s;结果输出1b345;

但是s=“Iamlucky”;s[8]=’p’;就是错误的。

对一位赋值要满足字符串长大于下标,也就是这一位本来就在字符串中。

求字符串的长度

用法:s.size();或s.length();

功能:返回s的长度,时间复杂度O(1),可以反复调用

例如:

s=”abcdefg”;n=s.size();则n=7;

islower(s[i]) s[i]<=’z’ && s[i]>=’a’

判断字符串s第i位是否小写字母,如果是返回1,否则返回0;

isupper(s[i])

判断字符串s第i位是否大写字母,如果是返回1,否则返回0;

isdigit(s[i])

判断字符串s第i位是否数字字符,如果是返回1,否则返回0;

s[i]=tolower(s[i])

将字符串s第i位改写为小写字母;

s[i]=toupper(s[i])

将字符串s第i位改写为大写字母;

查找子串1

用法:s.find(t);

功能:在s中查找t,如果t出现,则返回t第一个出现的位置(从0开始),否则返回2^64-1(赋值给int后可以转为-1)

查找子串2

用法:s.find(t,x);

功能:在s的第x位及之后查找t,如果t出现,则返回t第一个出现的位置(从0开始),否则返回2^64-1(赋值给int后可以转为-1)

拼接函数​​1​——字符串接字符

用法:s.push_back(ch);

功能:在字符串s后面加上一个字符ch

注意:时间复杂度为常数,可以反复调用

拼接函数2

用法:s.append(t);

功能:在字符串s后面加上一个字符串t

注意:时间复杂度为线性

拼接3

用法:s=s+ch; s=ch+s;

功能:在字符串s后面(或前面)加上一个字符ch

注意:时间复杂度不是常数,低于线性复杂度。拼接时不能是两个字符串常量拼接

替换字符串

用法:s.replace(x,len,t);

功能:将s的第x位及之后的len位替换为字符串t,下标从0开始。

注意:x~x+len-1一定要是合法的下标!

例子:s=“abcde”;x=1;len=3;t=“**”;执行s. replace(x,len,t)后,s=“a**e”。

复制子串函数

用法:s1=s.substr(t,x);

功能:将字符串s中从t位开始到x位前一位共(x-t)个字符复制到s1中。

样例:

s="12345asdf";

s1=s.substr(0,5);

输出结果为:12345

删除子串

删除子串1

用法:s.erase(x);

功能:删除s的第x位及之后的所有字符,返回一个字符串。下标从0开始。

注意:x一定要是合法的下标!

删除子串2

用法:s.erase(x,y);

功能:删除s的第x位及之后的y个字符,返回一个字符串。下标从0开始。

注意:x~x+y-1一定要是合法的下标!

删除子串3

用法:s.erase(it);

功能:删除对应地址为it及之后的元素

注意:it是地址

删除子串4

用法:s.erase(it1,it2);

功能:删除对应地址在[it1,it2)之间的元素

注意:it1,it2是地址,为左闭右开区间

插入字符串

用法:s.insert(x,t);

功能:在s的第x位上插入字符串t,下标从0开始。

注意:x一定要是合法的下标!

例子:s=“01234”;x=3;t=“abc”;执行s.insert(x,t)后,s=“012abc34”。

C++字符串指针

头尾指针函数

用法:s.begin();s.end();

功能:范围s的头尾指针,和数组指针一致。

注意:可以使用一些STL函数,例如sort(s.begin(),s.end());和reverse(s.begin(),s.end());

字符串的关系运算

关系运算符:>、<、==、>=、<=、!=

运算规则:无论比较的两个字符串长度是否相同,从左到右按照它们的ASCII码值逐一进行比较。当两个字符的ASCII值不等时,便可比较出大小。若短字符串和长字符串的左边字符都相等时,长串比短串值大。

‘A’的ASCⅡ值为65,‘a’的ASCⅡ值为97,所以‘a’>’A’ , "Ab" >"ab"

字符串类型转换成其他类型的函数(c++11可用)

字符串转整型 stoi(“123.36”)

字符串转long long stoll(“123.36”)

字符串转float stof(“123.36”)

应用实例:s="3454895.128";

a1=stoi(s);a2=stoll(s);a3=stof(s);

cout<<a1<<endl;     输出3454895

cout<<a2<<endl;     输出3454895

cout<<a3<<endl;      输出3.4549e+006

数转字符串函数(c++11可用)

to_string(int n)

功能:将整数转换成字符串。

to_string(double a)

功能:将实数转换成字符串,转换成的字符串小数点后有6位。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值