專業課——計算機專業基礎
東大計算機考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分鐘,“程序設計”僅實現了其中大部分。希望能給各位的備考和解題思路帶來一點啟發。