PAT小结

来源:互联网 发布:网络驱动没了怎么办 编辑:程序博客网 时间:2024/06/05 15:04

1. 细节失误汇总

1)==0与=0;

2)for(i=n-1;i>=0;i--)

3) 在和图有关的题中下标从1开始,所以和足以 i=0 i=1

4) pop() 

5) 在&&判断中,先判断S[i]是否为空,再判断S[i]是否满足条件,否则可能溢出

2. 超时注意点以及解决思路

1)循环套循环的搜索,一般是方法不对

2)如果没有想到更有效的方法,可以考虑是否里层循环不用每次都从头开始,比如上一次循环记录下一点,下次从这点开始就好;又比如一些出结果直接break或者continue

3)cin,cout输出不如scanf printf

4) string比较操作比cstring要大,所以一些比较输入用cstring 所以有scanf("%c",str) 以及strcmp(str1,str2) 

5)另外string读一个字符串再对每个字符操作,比逐一读入字符要效率

3. 数字、字符串处理

1) 大数加减乘除操作时,有时候不要遗漏carry作为左为最后溢出会单独为新的一位,不要漏掉

2) 一个数字换进制和reverse可以用一个循环式子表示,所以不要觉得复杂。

3)对称有size奇数和偶数的两种。并且判断对称的方法i=0;j=n-1;while (i<j){};

4) 判断素数,i<=sqrt(n);注意参数是double;

5)四舍五入整数的方法(round up to) int(a+0.5);  另外 a=5,b=2,c=float (a/b) 的结果是2.。。。必须分别float才行

6) string str

比较,直接> = <; 拼接直接+

复制:string b(a.begin(),a.end())  把a的某个部分给b

大小:str.length()

插入:str.insert(str.end(),s)

交换:str1.swap(str2);

删除:

         a="ABCD";a.erase(2);//从第一个字符开始保留2个字符cout<<a<<endl;//输出:AB

4. 容器

vector:  vector<int> v(m)   vector.resize(m) vector.back_push(p)  vector.pop() 

map:       map<string,set<int> > hs     has["XXX"].insert();  map<string,set<int >>::iteraror si; si=hs.find("XXX");  si->first; si->second; 

queue: 队列,在层序遍历用到

set:: 按照字典序排列好

5. hash与倒排索引

hash,除了数组可以hash,标准字符也可以

倒排索引处理好字符串,排序,和map容器

6. 排序

快排,注意cmp函数,以及对于容器,参数是str,begin()什么的

7. 动态规划

首先,找递推关系。其次用表(数组)记录,然后实现功能。难点在递推的寻找,可以联想数列的递推。

8. 最短路径

DIJ算法牢记。入口初始化,选出dv最小,标记为known,更新dv表+设置前置点。  如果相等 的判断条件不能再过程冲体现,则无法使用。

9.深搜、广搜

广搜,用queue. : 起点入队,判断队是否为空,起点相连点入队,队首相关操作+队首出列。

深度,有map[][]和vist[]。 起点vitit标记+起点操作,扫描所有其他未标记点若满足map[][]则以这个点为起点,知道遍历所有。

10.树和前中后遍历

树的重建问题,中序+另一种遍历可以重新构造树。

完全二叉树可以用数组表示。二叉树struct node{int data; *node lson,rson;}。 其他树搞不定了。。

11. 贪心

当做模拟问题,了解选择的条件,和选择之间的关系。 建议用isstation, isdestination 等表示条件方便识别。 总之难点在模拟的时候思路清晰

12.并查集

union() fx=find(x),fy=find(y); if(fx!=fy) root(y)=fx;

find()  return root(x)==x?x,root(x)=find(root(x))

0 0
原创粉丝点击