专业课——计算机专业基础
东大计算机考C语言和数据结构两门课,这是有鉴于地域、生源、学生必要素质等等,不必详谈。本人133,不好不坏、不高不低,在高分段只是标配分数。
重点在于权衡复习与考试。
一方面要重视复习,以学真本事为重;一方面要重视考试,通过有些技巧在投入产出问题上可以实现惠而不费。关于复习,为了知识,怎么复习都不为过,大家也很清楚,这里仅作提醒不再赘言,下面重点说一些考试技巧。
用书:C语言PPT+Google,天勤数据结构,真题
【注1】C语言简答题考察知识点文字表述和简单应用,代码题考的比数据结构更难,要在真题中大量训练,最好上机实践。数据结构真题考察方式极其固定,而天勤题目数量远少于王道,正好省出时间深入研究真题,对症下药。
【注2】如果是跨考或者基础太薄弱,那C语言还是需要一份教材,强推机械工业出版社的《C程序设计语言(第二版)》。比谭式教材优秀得多,比C primer白皮书或者类似教材薄的多。因为是国外的教材翻译过来,编写风格循循善诱、深入浅出,具有大量短小却有趣的许多代码实例。初学者用其他教材很容易被砖头一样厚的教材打蒙,或者被时不时冒出错漏搞得烦不胜烦。
接下来着重介绍三大复习要点:
首要就是重视真题,复习前先买一份真题,一定要立刻花时间着力分析考察方式。
【注】哪些不考——不复习;哪些不考编程题——重视理解不必着眼于代码应用;哪些知识点考察什么题型——命题思路要有数、解题套路要熟练、扣分陷阱要游刃有余;哪些代码是必背的——二话不说就默写。
其次,在分析过真题组成形式后,纲举目张,考什么就学什么,之后考什么就练什么,最后考场上老师要什么你就答什么。
【注1】基础阶段:先用PPT光速学习C语言,再刷真题中所有C语言简答题,最后刷真题中所有C语言读码题;先用一周28h刷一遍天勤数据结构,再刷真题中数据结构简答题。这个阶段要把知识点基础打牢,不急于背代码写代码,但要把真题中除代码题以外所有问题练一遍,最好掌握。实在不能掌握也要对错题和弱点留档,便于之后深入复习、针对性强化。
【注2】强化冲刺:先复习上阶段遗留错题和弱点,浏览和简单演算即可。再把链表、堆和栈、树、图的一些关键代码基本默写,即可在数据机构真题中练习代码题,核心任务是学会将默写的代码调整至适合题目实际需求的样子。同时可以尝试编写C语言代码题。
最后,查漏补缺、力求知识点全面掌握和真题研究透彻的同时,尽力升华编码能力,在代码题拿到更多分数。
【注1】要开始注意答题时间规划了,考试共3h=180min。C语言=3*简答题+4*读码题+3*编码题,数据结构=5*简答题+3*编码题。共有12道非编码题+6道编码题,12*7min+6*16min=180min恰好。实际上考试时能够通过熟练程度(节省草稿时间)在非编码题中省出不少时间,而且今年数据结构只考了4道简答题而不是之前的5道。省出的时间可以专门分给一些比较难或者自己想尽可能优化完善的编码题。
【注2】无视“升华”也可,根据天赋可以得110-140不等,多半会是120+。通过升华,根据天赋可以得125-150不等,多半会是130+,毕竟140分多少还是需要点天赋。
【注3】升华的目标就是编码题。那么数据结构不仅要会默写和应变调整,还要写的更好,思路更清晰;C语言首先要做到各种语句信手拈来,还要会点大纲上不写的东西(比如19年第一道题就考了大整数运算,自行Google)。不仅如此,要对代码的时间和空间复杂度尽力优化,还要在解题思路处尽可能通过文字展示你优于其他人的地方,这都需要将数学思想应用到解题当中。
接下来简单介绍时间花费:
图中共84h(按每天4h计算,约3周),没算考前一两天内的零碎学习。实际上最开始28小时我根本没学,这是由于我是本专业且二战考生,56小时足矣。中间合并的单元格是间断休息许多天,11月学41小时,12月学15小时。
如果是本专业有些基础的同学,复制56小时即可;
如果是本专业基础不太好的同学,请复制84小时;
如果是跨考,请至少花160小时复习,并且不要像我一样间断复习;
如果对此时间估计不放心或是做不到高效学习,根据自己所在档次,再酌情多花些时间就是了,复习顺序不必变化。
接下来我想通过介绍一道19年C语言考题,抛砖引玉。
19年·C语言编程题第一题:
自守数:平方的尾部是本身的数。示例:5*5=25,25*25=625,9376*9376=87909376。编写程序求100000以内的所有自守数。
看到题目第一反应就是又要大量循环判断,第二反应是100000的平方运算超过了4个字节。
那么如何体现你优于其他考生的素质呢?对大量循环判断进行复杂度优化,加入大整数运算的编程技巧。
后者请自行Google,而关于前者,无论你是否能在代码中实现,你都能在解题思想中向老师展示出来。具体方式如下:
首先心算10以内自守数:1,5,6。那么,100以内呢?
假定某二位数M=10n+m,其中n,m均为一位数,M是自守数,即M*M=100*N+M。将M的n,m表示代入,消去M,得到m*m=10*R+m,即m是自守数。以此类推,二位自守数的末位必为自守数,三位自守数的末两位必为自守数……五位数的末四位必为自守数。
换言之,二位数中有可能是自守数的数仅为尾数是1,5,6的30个数,备选项从99-9=90个一下就排除了三分之二。二位自守数的候选仅30个,那么三位自守数的候选不可能超过300个,是原有999-99=900个的三分之一。因此可以预见的是,如果先验证出二位自守数并存储,就可以得到远少于300个三位自守数候选。
事实上二位自守数只有两个:25*25=625,76*76=5756。那么三位自守数的候选仅有20个,竟然比二位自守数的30个候选更少!此时不妨预测,三位自守数可能不多于两个,后面每轮的候选数可能都比上一轮更少。
那么,程序设计思想就非常明确了。100000不是自守数,10以内自守数是1,5,6。我只需要分四轮找出二位数、三位数、四位数、五位数中的自守数,每一轮都要用到上一轮的计算结果,四轮的备选数预计不超过30*4=120个。
我相信以上的逻辑演绎不需要考生具备任何编程知识,只需要用心观察自守数的数字特征并做出一点微不足道的算式推导,即可得到。我相信老师看到这样的数学思想和解题思路,会愿意多给一点分数。如果编程实现,我想甚至有可能接近满分。
以上,我在考场上写入了“解题思想”部分,遗憾的是我只能给这道题分配25分钟,“程序设计”仅实现了其中大部分。希望能给各位的备考和解题思路带来一点启发。