大家好,又见面了,我是你们的朋友全栈君。
在9月8号下午的PAT考试中,我幸运的拿到了满分,用时1小时45分钟,排名第五,算是成功迈出了转专业的第一步。按照惯例应该嘚瑟一波,然而身边并没有人考这个,转念一想,不如把考试日志和备考经验教训记录下来,以期看见此文的后来者能少走一些弯路,更加高效的刷题学习(虽然可能并没有人能看到 _(:△」∠)_ )。
当然,在科班大佬面前我只是个尚未入门的弱鸡,因此这篇经验主要针对有意转行/业余爱好编程/基础薄弱的朋友。
作为第一次在网上写东西的语文渣,我已经预感到本文会比较乱,所以先把打算写的几个部分列出来:一是针对PAT的备考要点,二是刷题过程中可能走的弯路和遇到的坑,三是PAT考试流程和注意事项,四是PAT的相关信息和数据统计简介。另外还准备写一篇解题报告,主要是考试时的思路和AC代码。
一、PAT甲级备考要点
甲级题目的思考量都是不大的,主要是考察对数据结构基础知识的掌握和基本的编程能力,换言之,能否拿高分,和天分无关,主要取决于付出的时间和精力(满分往往还需要一点运气)。在学习和刷题过程中,半天做不出一道、找bug找到怀疑人生什么的太常见了,一定坚持下去,一段时间后你就会发现自己的进步~好,接下来说说备考要点,首先要具备c&c++和数据结构的基础,然后:
1、刷通甲级题库,并且关于树和图的30分大题尽量做两遍。这是最稳妥最有效的方法,甲级考题也常常会以题库里题目的改编形式出现,如这次的2、3、4题都可以在题库里找到相似的。另外,以前刷微博的时候看姥姥说过,甲级题库里有一些早期的保研机试题是超纲了的(比如涉及到动态规划的题目),而甲级真题是不会超纲的,所以,如果时间紧张,优先做考纲内的题,动态规划等超纲内容了解思想即可。
2、强烈建议配合晴神宝典(即《算法笔记》,胡凡、曾磊著)刷题!!这本书我只能说相见恨晚,可以帮助非科班人士节省大量时间,而且要优先学习STL,非常强大非常实用。
3、开一个记事本,记录自己常犯的编程错误和考虑不周之处。因为把“==”写成“=”之类的错误而浪费一下午简直令人崩溃,而记下常犯的错误则能辅助自己快速纠正错误习惯。尤其是对于新手,“我觉得我会做”和“我真的能AC”之间差了十万八千里,唯有脚踏实地多写多总结才能提高。
4、AC不了不要死磕,去找大神的博客学习吧。比如柳神的题解就都很厉害。
5、在学习大佬博客的时候,你可能会发现某些题你不会做是因为你不会某些算法,比如dijkstra+DFS,这时可以去翻晴神宝典,动笔or敲键盘写一遍模板,然后设个备忘过几天回来再做。这样会记得比较牢。
6、其他一些小tips:“二指禅”的朋友建议练习一下标准指法和盲打,盲打编程比低头抬头的敲键盘舒服很多;因为考场都是台式机,所以练习的时候最好买个大键盘,而且大键盘打字速度也更快;去官网找到考场编译器,下载相应编译器并练习,用Dev-C++的话注意记住使其支持c++11的操作。
PS:以下两个坑希望大家在刷题前注意一下:1)甲级1029,题干中说数据范围是long int,但实际上测试数据都在int范围内,由于内存限制,按long int写是过不了的。(更正:这里是我理解错了,实际上,long int 不是 long long。古老的C语言有short int和 long int,现在 int 就默认为是 long int。) 2)甲级1108,像1.之类有小数点但没有小数位的数据是合法的(做完这题后建议学习一下sscanf和sprintf函数)
二、我的学习过程和走过的弯路
我是电气工程专业的,所以老老实实的学过一年c++,也水过一学期的数据库。尽管如此,在今年3月学习MOOC上浙大的数据结构时也被虐的很惨。而且那个时候主要把考研作为一个备选念头,只是单纯的加了考研群和以课外拓展的心态学习数据结构,效率极度底下,现在回想起来,真是又把大好时光喂了狗。。。总之,编程入门很可能比想象的难,放平心态,但也要给自己一点压力,写代码尽量限定时间。
有了C++和数据结构的基础后就只剩刷题了。但不要自己闷头刷和死磕,尤其是连STL都不会用的时候。我7月份平均下来每天刷题大概两小时,但是只做了20几道,知识储备方面也只有看别人题解和博客学到了一点零碎的STL及字符串处理知识,可以说是把大量时间花在了无用功上。
到了八月,无意中翻看了晴神宝典,当时就感觉“哇!这就是我想要的!”(感觉像推销哈哈,但真的就是这种感觉!)。然后连续几天学习了STL、dijkstra+DFS、动态规划和字符串处理,然后做题速度直接就质变了= =八月份压力比较大了,每天花一个下午做4题的样子,时间控制在三小时,但是因为做完题基本不想干其他事了,所以每天都是奉献了一下午给PAT的,限时限量后明显感觉自己的编程基本功在慢慢变好。这个阶段最后悔的就是太喜欢死磕,总觉得题要自己做出来才行,看别人的就不算数了,于是好些晚上都对着屏幕,头晕眼花的找下午没有AC的题目的bug。其实死磕这种题真的没有意义,太浪费时间,等慢慢有了更多积累再回头看自然而然就会做了。(当然也有例外,1026我留到最后做的,结果怼了一整天也没成功,最后百度大佬的解题报告后又改了一晚上 _(:△」∠)_ )
总结一下:
其实就是初学者要以学习为主,应该把时间主要花在知识的积累和对他人优秀思路的学习上,而非总是自己闷头搞个又丑又笨的解法,只有先积累到一定程度才能思考出好的方法。
以及,有压力才有效率,做题要限时定量。
最后,学习要系统化,这里再次推荐晴神宝典(感觉自己要变成小迷弟了= =)
三、考试流程及注意事项
这个地方简单提一下,毕竟很少有人会在考试中出问题,但总是有出各种状况的。。。
我参加的这次考试流程大致如下:提前15分钟进场,检查准考证,签到,做到指定位置。老师已经帮忙开好考试的页面了,不许自己再开其他浏览器,不然会被截屏并算违纪。等开考时间到了点击进入题库就可以答题了,开考前不要点进去,不然你看不到题目但是会计算考试时间。
因为企业在看你成绩的时候还可能考虑你的提交次数,所以,提交前最好检查一遍。
PS:我在的考场出状况的同学有:迟到、没带准考证、看到电脑息屏不是摇摇鼠标而是直接重启、踢到电源线导致重启。毕竟交了150+,大家还是要认真点对待啊。
PAT对时间和内存的限制一般很宽,所以只要大方向是对的,就不用太在意优化代码了。实际上,大多数题目你正常做耗时在限制的1/4以下。而且,很多题都是直接暴力解决就好了,要是想不到好方法,就暴力枚举吧,说不定直接就AC了呢?
四、PAT的相关信息和数据统计
PAT考生主要分为找工作党和考研党(甲、顶级可抵浙大考研机试),也就是说,除了极少数可能存在的来玩的大佬,甲级大多考生为普通选手,以及1/3左右的捐款选手(据说每次都有1/3左右的0分,估计是交了钱弃考了)。
以下统计了近几年甲级的考试人数、满分人数、对应习题集的习题:
时间 | 2015.3 | 2015.9 | 2015.12 | 2016.3 | 2016.9 | 2016.12 | 2017.3 | 2017.9 | 2017.12 | 2018.3 | 2018.9 |
甲级人数 | 468 | 659 | 276 | 532 | 622 | 271 | 973 | 1207 | 464 | 1459 | 2237 |
满分人数 | 42 | 26 | 43 | 21 | 42 | 19 | 161 | 59 | 9 | 56 | 49 |
满分率 | 8.97% | 3.95% | 15.58% | 3.95% | 6.75% | 7.01% | 16.55% | 4.89% | 1.94% | 3.84% | 2.19% |
对应习题 | 1092-1095 | 1100-1103 | 1104-1107 | 1108-1111 | 1116-1119 | 1120-1123 | 1124-1127 | 1132-1135 | 1136-1139 | 1140-1143 | 1148-1151 |
此外,2018年考研机试情况如下:去年浙江大学计算机类专业考研进入复试有235人,其中118人选择使用PAT成绩代替机试成绩,这118人中有27人满分。最终,机试三人缺考,满分48人,平均分78.43,因为强军计划比较特殊,除去这一部分考生的话机试平均分80.18。
五、关于考纲
考纲里要求掌握的算法为:哈希映射、并查集、最短路径、拓扑排序、关键路径、贪心、深度优先搜索、广度优先搜索、回溯剪枝等。
哈希映射:一般会用map和unordered_map就好。此外,比如说题目固定了关键字为4个大写字母,那么可以把关键字看成26进制数,这样就能把字符串转换为int型数据处理,提高程序运行速度。当然基本概念也不能忘,解决哈希冲突的基础方法要理解,包括开放地址法(线性探测、平方探测)和链地址法(开放定址法)。
并查集:主要就是掌握findfather函数(找到某节点所在集合的“根”)。压缩路径的函数如下:
int findfather(int a){
if(a!=father[a]{
father[a]=findfather(father[a]);
}
return father[a];
}
最短路径:主要掌握dijkstra+DFS。如果出现了负边权,就用bellman-ford(尚未考过)。
拓扑排序、关键路径:可以做做PTA上的 Data Structures and Algorithms (English)题目集7-12和7-18,数据结构与算法题目集(中文)7-11。
贪心:考的很少。印象比较深的是甲级题库1033 To Fill or Not to Fill,挺难的。
DFS、BFS:算是必须掌握的基础了。
回溯剪枝:就记得甲级题库里的1103了,不过因为内存限制放的宽,用动态规划暴力做也可以。
此外,AVL树的插入删除要会写。
根据树的各种遍历方式构建二叉树经常考到,最好熟练掌握。
堆的构建、删除、插入要会写,即“自顶向下”和“自底向上”调整堆。
最后,关于最小生成树和动态规划,这两个都是顶级的内容了,基本不会考,但是思想并不复杂,多学一点总是好的,学有余力建议了解一下。动态规划甲级题库有好几道,背景都很经典;求最小生成树用的是贪心算法,可以做下PTA上数据结构与算法题目集(中文)7-10,prim和kruskal算法都试试。只是简单学习的话还是很快的,也比较有意思。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126442.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...