今天的PAT认证是我人生中的第二次算法考试,第一次是六年前大一学习 C 语言时学校举行的算法比赛。跟第一次一样,这次考得也非常失败,只做出来前两道题。
去年七月份辞职跨专业考研,选了自己感兴趣的计算机,认认真真复习了半年,初试成绩还行,应该能进复试。初试结束后,我就开始在 OJ 上面做题,为机试做准备。为了能让自己简历好看些,我报考了 PAT、CCF认证。这次 PAT 认证我的目标是满分,然而。。。
按照往期题目的情况来看,本次题目算很常规的,没有特别难或者特别偏的题。
第一题比较简单。如果 n 和 n+6 都为素数,则称 n 和 n+6 为六素数对。现在给出一个数,判断这个数是否为六素数对中的一个,如果是,则输出和它配对的最小的那个素数,如果不是,则输出大于这个数的最小的六素数。
第二题也比较简单。给出校友会中 n 个人的 id ,给出参加校庆的 m 个人的 id,问这 m 人中有多少个人是校友会的,并输出属于校友会的人中年龄最大者的 id 。如果没有人是校友会的,则输出这 m 人中年龄最大者的 id 。首先对校友会的人用 map
第三题稍微有点复杂。就是给出 n 个人之间的 m 条通话记录,时长小于 5 分钟的通话被视为短通话。如果某个人打出的短通话次数大于 k 次,并且给他回电话的人数少于他打出的人数的 20%,就认为这个人是一个诈骗嫌疑犯。如果两个嫌疑犯之间通过电话,则这两个嫌疑犯是一个团伙的。要求按团伙输出这些诈骗嫌疑犯,每行输出一个团伙,嫌疑犯按递增次序输出。这道题需要设置邻接矩阵记录每个电话,注意是单向的,只记录打出者至接收者,设置 times[maxn] 记录每个人短通话的次数,设置 set
第四题很常规。先根据后序序列和先序序列建立二叉树,然后判断给出的话是否正确。如果了解 stringstream 就会很简单啦,按行读入每句话,然后用字符串流的方式读入每个单词,判断这句话的含义是什么,然后进行判断即可。
虽然这次试题简单,但是自己考得很差。主要原因是缺乏考试经验,对上机环境不熟悉,自己水平也太差。
之前我一直是用 VS 2017 写代码的,VS 2017 简直太友好啦:代码高亮,自动补全,自动缩进,自动添加空格,实时编译,函数用法提示,强大的调试窗口等等。考前我看了上机环境中有 VS 2010,根据 Office 系列来看,我以为 VS 2010 会和 2017 差不多,因此也就没注意 IDE 什么的。
然而到了考场,我用 VS 写了个 helloworld,编译可以过,但是链接会出错,也不知道问题出在哪里,可能是什么路径或者权限设置得不太对。我脸皮太薄了,没敢问老师怎么解决,因为感觉这应该是非常小儿科的问题,怕被笑话。
幸好上机环境还提供了CodeBlocks 和 Dev C++。之前装了个CB,然而还是不会用。于是我试着用 Dev C++,还好,helloworld 运行出来了,不过Dev C++ 界面各种不习惯,缩进很奇怪,也没有自动添加空格,也几乎没有代码补全,我也不会调试,总之各种难用,但是欣慰的是我终于可以写代码啦哈哈哈哈,好心酸。
这个时候已经过去十几分钟了,我赶快开始做题,先做第一题,嗯,比较简单,很快就写出代码了,编译,运行,嗯第一个样例过了,哎第二个样例怎么过不去,奥,原来代码有点小问题,改了之后运行还是过不去,怎么改都过不去,然后愣在那研究了好几分钟,最后发现每次修改代码都得重新编译,修改才会生效,然后我就重新编译了,好了,样例过了,赶快提交。AC!第一道题过了!
此时已经过去半个小时了,赶快看第二题,几分钟读懂题意,然后开始写代码,十几分钟写完,编译链接运行,测试样例过了,提交,有两个测试点错了?不知道哪里出问题了,想了好久,又读了两遍题,发现人数为 0 的时候 0 也要输出,我把这里搞错了,修改提交,AC!
这个时候已经过去一个小时了。我才看第三题,题目比较长,感觉比较复杂,看了两分钟看不下去了,先看第四题吧,果然第四题比较好理解,很快读懂题意开始写代码,之前有专门练过类似的算法,写起来基本不用怎么思考,120行,很快就写完了,然而有一个致命问题,我忘记了stringstream 怎么用了!!!这个要是不用 stringstream 就太麻烦了!而且非常容易出错。可是我把它在哪个头文件里面都忘了,sstirng? stringstream? 试过了都不行,就是没想起来sstream,一开始我还把 stringstream 写成了 streamstring 了,真的是。。。然后这个题就卡在这里了,Dev C++ 给的提示信息也不够,我又试了 VS 2010,给的错误提示信息也看不懂,总之 stringstream 没法用了,然后就徘徊,无奈。。。如果 stringstream 会用,第四题我有很大把握是可以搞出来的。
时间就这么过去了俩小时,想想算了吧,还是先看第三题吧。静下心来读了三遍,终于理解题目什么意思了,然后开始写代码,一开始我先把所有的嫌疑犯放进一个集合里面,想先看下嫌疑犯找的对不对,就先运行一下,结果编译器说我定义的 auto 变量不能用。。。卧槽这什么鬼编译器啊,auto 都不能用!我改了一下编译选项,在有限的几个选项里面想选一个版本最高的,结果直接都不能运行了,这又什么鬼,仔细看了下,可能我选的是 64 位的编译器,这系统是32位的,然后我又把编译器改回32位的,但编译器还是太老,识别不了这个 auto 变量。好吧,试试迭代器来遍历集合,终于试出来了,答案不太对,可能思路有点小问题,这个时候只剩下半小时了,哎,一下子就没心情继续写代码了。再试试第四题吧,试来试去还是不行。。。最后实在没心思看题了,就去看答题排名,卧槽好多人满分的,我排名6百多,哎,算了算了,自己就这水平了。最后就瞎看了一会,反正代码肯定是调不出来了,我放弃挣扎了。老师说证书会在结束后半小时之内出来,也可以选择不要证书。我考得这么差还要啥证书,跟老师说了不要证书我就走了。
这次考试需要总结的地方大致有以下几点。①不能太依赖于VS了,要尽量熟悉一些常见的IDE,比如 CodeBlocks或者 Dev C++,C-Free之类的,并且要学会在这些 IDE 上面调试。②自己之前的学习很不到位,竟然连 stringstream 都不会用,以后要经常做一些笔记,把一些偏的,不常见的知识点记录下来,经常巩固复习。③我敲代码的速度还是不行,还要好好练练指法、盲打之类的。④认真读题,认真读题,认真读题!题都理解错了,编的代码能对?
总之,这次PAT考得很差,不理想。但也没白考,暴露了自己很多问题,接下来需要尽快改进,争取在3月17日在CCF认证中拿个好成绩。
自己的计算机职业素养还很差,还得夯实基础,继续提高。加油!