OJ刷题总结

1、设定字符串长度时要比规定长度至少大1
不能说字符串最大长度10000,然后你就设定char str[10000],因为字符串的最后一位是’\0’,所以必须给’\0’留位置。
2、取模运算
(a+b)%e = (a%e+b)%e
(a+b+c)%e =( (a%e+b)%e+c)%e
避免数字加和过大,可以在计算中途就进行取模运算
3、看题目输入数据的范围来定义数据类型
如果输入数据的范围很大,那可能数据使用字符串存储,不大的话(109、232)用int,稍微大一些(1018、264)以内用long long。
4、读入字符串
读入字符串时只有gets会读入空格,遇到换行符终止,其他(scanf,cin等)都不会读入空格
5、 判断字符串
判断读入的字符数组是否是‘0’:
错误写法:str==“0”
正确写法:strcmp(str,“0”)==0
(判断字符是否等于’0’是可以用等号直接判断的,判断字符串的话不可以)
(strcmp函数在头文件里,如果两个字符串相等,返回0,否则返回正整数或者负整数)
(C++的string类型是在< string >头文件里)
(C++里面的string类型是可以直接用等于号去比较的。比如如果str的类型不是char数组,而是string,那么可以直接用等于大于小于号去比较)
6、关于链表
(1)注意题目中有可能有无效节点!!!即给出一堆节点,然后给出首地址,有节点并不在该首地址的链表上。即给出的节点不一定都是有效节点。
解决的方案:

  1. 定义静态链表,节点性质由bool型变量flag定义,flag为false表示无效节点
  2. 初始化,令所有flag均为false
  3. 由链表首地址遍历链表,并标记有效节点的flag为true,同时计数有效节点的个数count,即可知道哪些是有效节点,有效节点的个数为多少。

(2)测试边界条件:链表有可能为空(即所有节点均是无效节点)。所以要特判链表为空的情况。
(3)输出地址:留意最后地址-1的输出,可能会和前面的输出格式不一样。

7、关于相等赋值
如果类型是vector、stack等,则可以直接b = a,即向量b等于向量a;
如果是数组,不可以数组b等于数组a。
8、vector的比较
若有向量a,向量b,
则a>b代表:
在这里插入图片描述
9、C++ 遇到reference to ’ *** ’ is ambiguous 错误
表示用户定义的变量和系统库中的变量名重名,比如count变量和< algorithm>中的变量就有重名情况,可以把count换成Mycount。
10、输入数字
当题目中输入的是“00”,“01”,“02”时,不用按照字符串去读,直接按照数字int去读的话,系统会自动把前面的0去掉,系统存储的是数字0、1、2。
11、数组下标
注意审题,有的题目数组下标是从1开始,有的是从0开始
12、多轮输入的要清零
有多轮输入的,比如有vis数组的,注意每完成一轮后,回归原来的状态。清零可以用< algorithm >里面的fill函数。
13、字符串和数字的映射
可以用map< string,int >直接建立字符串与整型的映射关系。并且这个有个好处,就是map < type1, type2 >是自动按照键type1从小到大进行排序的。

map<int,string> intToString;//编号->姓名
map<string,int> stringToInt;//姓名->编号

//判断str是否出现过:
if(stringToInt.find(str)!=stringToInt.end()){
	return stringToInt[str];
}

14、C++标准模板库STL中,set和map都具有自动排序功能
由于set和map内部都是使用红黑树实现的,在建立映射的过程中会自动实现键值从小到大排序。
15、关于数组赋值
如果想要给整个数组都赋值0,只需把第一个元素赋为0,如:

int a[10] = {0};

如果赋为其他值,如-1,那么不可以 int A[ 10 ] = {-1},这样不管用,应该用fill函数,
fill(A,A+10,-1)。
16、gets函数
PAT中使用gets函数会报错,PAT不再支持gets函数。可以将gets函数替换为

#include
using namespace std;
.......
char S[1010];
cin.getline(S,1010);//1010是S的长度

你可能感兴趣的:(算法笔记)