到復(fù)習(xí)體系搭建)
1. 這套題到底值不值得刷先搞清楚CSP-S第一輪在考什么CSP-S第一輪也就是很多人口中的“初賽”在整條競賽路徑里扮演的角色其實(shí)有點(diǎn)像高考前的會(huì)考——它不決定你最終能走多遠(yuǎn)但如果你在這里翻車后面的一切都免談。我見過太多代碼能力不錯(cuò)的選手因?yàn)檩p視第一輪最后卡在分?jǐn)?shù)線外面連第二輪的門都摸不到。所以當(dāng)你看到一份“CSP-S2026第一輪試題”附帶答案解析和Markdown源碼的時(shí)候首先要判斷的不是題目難不難而是這份材料能不能幫你建立起對(duì)整張?jiān)嚲淼耐暾J(rèn)知。CSP-S第一輪考什么簡單說就是三塊計(jì)算機(jī)基礎(chǔ)知識(shí)、算法與數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)、以及閱讀程序和完善程序的能力。前兩塊靠積累和記憶第三塊靠的是真正的代碼理解力。很多選手覺得初賽就是背背知識(shí)點(diǎn)這個(gè)認(rèn)知是極其危險(xiǎn)的。從近幾年的命題趨勢來看閱讀程序題和完善程序題的比重在增加而且代碼邏輯越來越繞單純靠“蒙”和“排除法”已經(jīng)很難拿到高分了。這份試題的價(jià)值在于它不只是一份卷子而是附帶了解析和Markdown源碼。解析能幫你理解每道題背后的知識(shí)點(diǎn)和推理過程Markdown源碼則意味著你可以直接拿來做二次整理——比如導(dǎo)入到自己的筆記系統(tǒng)里或者重新排版成適合自己的復(fù)習(xí)資料。我個(gè)人的習(xí)慣是拿到任何一份真題先把Markdown源碼過一遍把題目按知識(shí)點(diǎn)分類然后再逐題做。這樣做的好處是你能清楚地看到哪些知識(shí)點(diǎn)是反復(fù)出現(xiàn)的哪些是你薄弱的環(huán)節(jié)。適合誰來參考這份材料如果你是第一次參加CSP-S的選手這份試題可以幫你快速了解考試形式和難度分布如果你已經(jīng)有過參賽經(jīng)驗(yàn)但成績不理想這份材料可以幫你做針對(duì)性的查漏補(bǔ)缺如果你是教練或者學(xué)長這份帶源碼的試題可以直接作為教學(xué)素材使用。不管你是哪種情況接下來的內(nèi)容會(huì)從整卷設(shè)計(jì)思路、核心知識(shí)點(diǎn)拆解、實(shí)操做題方法、以及常見坑點(diǎn)四個(gè)維度把這份試題的價(jià)值徹底榨干。2. 整卷結(jié)構(gòu)拆解15道選擇3道閱讀2道完善分?jǐn)?shù)怎么分布2.1 選擇題的命題邏輯與高頻考點(diǎn)分布CSP-S第一輪的選擇題通常是15道每題2分共30分。別看分值不高這30分往往是拉開差距的關(guān)鍵。選擇題的考點(diǎn)分布大致可以分成幾個(gè)板塊計(jì)算機(jī)組成原理、操作系統(tǒng)基礎(chǔ)、網(wǎng)絡(luò)基礎(chǔ)、數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)學(xué)基礎(chǔ)、以及一些雜項(xiàng)常識(shí)。從近幾年的趨勢來看數(shù)據(jù)結(jié)構(gòu)與算法相關(guān)的選擇題占比最高通常能占到5到6道。這里面又細(xì)分為時(shí)間復(fù)雜度分析、排序算法特性、樹與圖的基本性質(zhì)、哈希表沖突處理等。比如有一道經(jīng)典題型是給你一段偽代碼讓你判斷它的時(shí)間復(fù)雜度這種題看起來簡單但如果你對(duì)循環(huán)嵌套和遞歸的理解不夠深很容易選錯(cuò)。計(jì)算機(jī)組成原理的題目通常有2到3道涉及進(jìn)制轉(zhuǎn)換、補(bǔ)碼運(yùn)算、浮點(diǎn)數(shù)表示、存儲(chǔ)層次結(jié)構(gòu)等。這類題目屬于“會(huì)就是會(huì)不會(huì)就是不會(huì)”的類型沒有什么技巧可言只能靠平時(shí)積累。我建議把二進(jìn)制、八進(jìn)制、十六進(jìn)制之間的轉(zhuǎn)換練到條件反射的程度因?yàn)檫@是最基礎(chǔ)的送分題丟了可惜。操作系統(tǒng)和網(wǎng)絡(luò)基礎(chǔ)的題目加起來大概3到4道??歼M(jìn)程與線程的區(qū)別、死鎖的四個(gè)必要條件、TCP三次握手、IP地址分類等。這些知識(shí)點(diǎn)在大學(xué)的計(jì)算機(jī)基礎(chǔ)課程里都會(huì)講到但競賽的考法往往更靈活不會(huì)直接問你“死鎖的四個(gè)條件是什么”而是給你一個(gè)場景讓你判斷會(huì)不會(huì)發(fā)生死鎖。數(shù)學(xué)基礎(chǔ)題大概2道左右涉及排列組合、概率、數(shù)論初步等。這類題目有時(shí)候需要一點(diǎn)巧勁比如用容斥原理或者遞推關(guān)系來簡化計(jì)算。雜項(xiàng)常識(shí)題一般1到2道可能考最新的技術(shù)動(dòng)態(tài)或者計(jì)算機(jī)歷史這部分性價(jià)比最低不建議花太多時(shí)間專門復(fù)習(xí)。2.2 閱讀程序題的三種題型與應(yīng)對(duì)策略閱讀程序題是CSP-S第一輪的重頭戲通常有3道每道題又分成若干小題總分值在40分左右。這類題目給出一段完整的代碼然后問你程序的輸出是什么、某個(gè)變量的值是多少、或者程序的功能是什么。第一種題型是直接模擬型代碼邏輯比較直白你只需要按照代碼一步步執(zhí)行把中間結(jié)果記下來就行。這種題考驗(yàn)的是耐心和細(xì)心最容易出錯(cuò)的地方是循環(huán)邊界和數(shù)組下標(biāo)。我的建議是做這類題的時(shí)候一定要在草稿紙上畫表格把每次循環(huán)的關(guān)鍵變量值都列出來不要試圖心算。第二種題型是算法理解型代碼實(shí)現(xiàn)的是一個(gè)經(jīng)典算法但可能寫得比較繞或者用了一些不常見的寫法。比如用遞歸實(shí)現(xiàn)快速排序但基準(zhǔn)值的選擇方式很特殊。這種題要求你不僅能讀懂代碼還要能識(shí)別出它背后的算法思想。平時(shí)多積累經(jīng)典算法的多種實(shí)現(xiàn)方式考試時(shí)就能快速反應(yīng)。第三種題型是邏輯推理型代碼本身不長但邏輯非常繞可能涉及位運(yùn)算、遞歸回溯、或者狀態(tài)壓縮。這種題是最難的也是最容易拉開差距的。做這類題的時(shí)候我習(xí)慣先找出代碼的“不變式”——也就是在每次循環(huán)或遞歸中始終保持為真的條件然后從這個(gè)不變式出發(fā)去推導(dǎo)最終結(jié)果。2.3 完善程序題的填空技巧與常見陷阱完善程序題通常有2道每道題給出一個(gè)不完整的程序讓你從選項(xiàng)中選出最合適的語句填入空白處。這類題目考的是你對(duì)算法實(shí)現(xiàn)細(xì)節(jié)的掌握程度以及對(duì)代碼整體邏輯的把控能力。做完善程序題第一步永遠(yuǎn)是通讀全文理解程序要做什么。很多選手一上來就看空白處然后試圖從選項(xiàng)里找答案這是大忌。因?yàn)槟闳绻焕斫庹麄€(gè)程序的意圖很容易選出一個(gè)語法正確但邏輯錯(cuò)誤的選項(xiàng)。第二步是分析空白處的上下文。空白處需要填的語句往往和它前后的代碼有緊密的邏輯聯(lián)系。比如前面剛做完一個(gè)判斷后面就要根據(jù)判斷結(jié)果更新某個(gè)變量那么空白處很可能就是更新語句。再比如如果空白處位于一個(gè)循環(huán)的末尾那么它很可能是循環(huán)變量的更新或者某個(gè)累加操作。第三步是代入選項(xiàng)驗(yàn)證。把每個(gè)選項(xiàng)代入空白處然后快速在腦子里過一遍程序的執(zhí)行流程看看是否會(huì)出現(xiàn)邏輯矛盾或者死循環(huán)。這里有個(gè)小技巧如果某個(gè)選項(xiàng)會(huì)導(dǎo)致數(shù)組越界或者變量未初始化就使用那它大概率是錯(cuò)的。常見的陷阱包括循環(huán)邊界差一、變量類型不匹配、遞歸終止條件缺失、以及運(yùn)算符優(yōu)先級(jí)錯(cuò)誤。這些坑我在做題和教學(xué)的過程中見過太多次了后面會(huì)專門用一節(jié)來詳細(xì)講。3. 核心知識(shí)點(diǎn)逐個(gè)擊破從進(jìn)制轉(zhuǎn)換到動(dòng)態(tài)規(guī)劃3.1 計(jì)算機(jī)基礎(chǔ)進(jìn)制、編碼與存儲(chǔ)進(jìn)制轉(zhuǎn)換是每年必考的內(nèi)容沒有例外。二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制之間的相互轉(zhuǎn)換必須做到不假思索。我見過有選手在考場上用筆算十進(jìn)制轉(zhuǎn)二進(jìn)制算了五分鐘還沒算完這就是平時(shí)練得太少。進(jìn)制轉(zhuǎn)換的核心方法就兩個(gè)除基取余法用于十進(jìn)制轉(zhuǎn)其他進(jìn)制按權(quán)展開法用于其他進(jìn)制轉(zhuǎn)十進(jìn)制。對(duì)于二進(jìn)制和八進(jìn)制、十六進(jìn)制之間的轉(zhuǎn)換可以利用它們之間的倍數(shù)關(guān)系快速完成——三位二進(jìn)制對(duì)應(yīng)一位八進(jìn)制四位二進(jìn)制對(duì)應(yīng)一位十六進(jìn)制。補(bǔ)碼運(yùn)算也是高頻考點(diǎn)。正數(shù)的補(bǔ)碼就是它本身負(fù)數(shù)的補(bǔ)碼是取反加一。這里有個(gè)容易混淆的地方補(bǔ)碼的符號(hào)位參與運(yùn)算而原碼和反碼的符號(hào)位不參與運(yùn)算??荚囍薪?jīng)常出現(xiàn)給你兩個(gè)補(bǔ)碼讓你算加法然后判斷是否溢出的題目。溢出的判斷規(guī)則是兩個(gè)同號(hào)數(shù)相加如果結(jié)果的符號(hào)與操作數(shù)符號(hào)不同則發(fā)生溢出。浮點(diǎn)數(shù)的表示在近幾年的考試中出現(xiàn)頻率有所上升。IEEE 754標(biāo)準(zhǔn)是重點(diǎn)需要掌握單精度和雙精度的位數(shù)分配、偏移量的計(jì)算、以及規(guī)格化數(shù)的表示范圍。這部分內(nèi)容比較抽象建議結(jié)合具體的二進(jìn)制例子來理解不要死記公式。存儲(chǔ)層次結(jié)構(gòu)也是??純?nèi)容包括寄存器、高速緩存、主存、輔存的速度和容量關(guān)系以及局部性原理。這類題目通常以選擇題的形式出現(xiàn)難度不大但需要你對(duì)各個(gè)層次的特點(diǎn)有清晰的認(rèn)識(shí)。3.2 數(shù)據(jù)結(jié)構(gòu)樹、圖與哈希表的經(jīng)典考法樹是數(shù)據(jù)結(jié)構(gòu)部分的重中之重。二叉樹的性質(zhì)、遍歷方式、以及特殊二叉樹完全二叉樹、滿二叉樹、二叉搜索樹、堆的特性都是必須掌握的。比如完全二叉樹中如果節(jié)點(diǎn)編號(hào)從1開始那么節(jié)點(diǎn)i的左孩子編號(hào)是2i右孩子編號(hào)是2i1父節(jié)點(diǎn)編號(hào)是i/2向下取整。這個(gè)性質(zhì)在閱讀程序題中經(jīng)常出現(xiàn)因?yàn)楹芏嘤脭?shù)組實(shí)現(xiàn)的二叉樹都依賴這個(gè)關(guān)系。圖的考法主要集中在存儲(chǔ)結(jié)構(gòu)和基本算法上。鄰接矩陣和鄰接表的優(yōu)缺點(diǎn)對(duì)比、深度優(yōu)先搜索和廣度優(yōu)先搜索的遍歷序列、最小生成樹的Prim和Kruskal算法、最短路徑的Dijkstra和Floyd算法這些都是老生常談的考點(diǎn)。需要注意的是考試中往往不會(huì)直接考算法的完整實(shí)現(xiàn)而是考算法執(zhí)行過程中的某個(gè)中間狀態(tài)比如“當(dāng)Dijkstra算法執(zhí)行到第三步時(shí)dist數(shù)組的值是什么”。哈希表在近幾年的考試中出現(xiàn)的頻率越來越高。開放地址法和鏈地址法的區(qū)別、裝填因子的計(jì)算、以及沖突處理過程中的探測序列都是常見的考法。有一道經(jīng)典題目是給定一個(gè)哈希函數(shù)和一組關(guān)鍵字按照線性探測法插入哈希表然后問你某個(gè)關(guān)鍵字在表中的位置。這種題只要耐心模擬一般不會(huì)出錯(cuò)。3.3 算法基礎(chǔ)排序、查找與復(fù)雜度分析排序算法的考查方式主要有兩種一種是直接問你某個(gè)排序算法的時(shí)間復(fù)雜度或者穩(wěn)定性另一種是給你一組數(shù)據(jù)讓你寫出某種排序算法執(zhí)行一趟后的結(jié)果??焖倥判颉w并排序、堆排序是重點(diǎn)因?yàn)樗鼈兊臅r(shí)間復(fù)雜度都是O(n log n)但實(shí)現(xiàn)方式和適用場景不同??焖倥判虻膒artition過程是高頻考點(diǎn)。你需要清楚地知道每一趟partition之后基準(zhǔn)值會(huì)被放到最終位置上而且基準(zhǔn)值左邊的元素都不大于它右邊的元素都不小于它??荚囍薪?jīng)常給出一個(gè)數(shù)組讓你寫出第一趟快速排序后的結(jié)果這時(shí)候基準(zhǔn)值的選擇就很重要了——如果題目沒有特別說明通常選擇第一個(gè)元素作為基準(zhǔn)值。查找算法主要考二分查找。二分查找的變體很多比如查找第一個(gè)大于等于目標(biāo)值的位置、查找最后一個(gè)小于等于目標(biāo)值的位置等。這些變體在完善程序題中經(jīng)常出現(xiàn)因?yàn)樗鼈兊倪吔鐥l件很容易寫錯(cuò)。我建議把二分查找的幾種常見寫法都背下來考試時(shí)直接套用不要臨時(shí)推導(dǎo)。復(fù)雜度分析是貫穿整張?jiān)嚲淼暮诵哪芰?。不管是選擇題還是閱讀程序題都要求你能快速判斷一段代碼的時(shí)間復(fù)雜度。這里有個(gè)經(jīng)驗(yàn)看循環(huán)的嵌套層數(shù)以及每層循環(huán)的迭代次數(shù)與問題規(guī)模n的關(guān)系。如果是一個(gè)單層循環(huán)迭代次數(shù)是n那就是O(n)如果是雙層嵌套每層都是n那就是O(n2)如果是遞歸就要寫出遞推式然后求解。3.4 數(shù)學(xué)與邏輯排列組合、概率與位運(yùn)算排列組合的題目通常以“有多少種方案”的形式出現(xiàn)。核心方法就兩個(gè)加法原理和乘法原理。加法原理適用于分類計(jì)數(shù)乘法原理適用于分步計(jì)數(shù)??荚囍薪?jīng)常出現(xiàn)的是帶限制條件的排列組合問題比如“甲乙不相鄰”、“甲乙必須相鄰”等這時(shí)候就需要用到捆綁法、插空法等技巧。概率題在近幾年的考試中有所增加主要考古典概型和條件概率。古典概型的核心是計(jì)算樣本空間的大小和事件包含的樣本點(diǎn)數(shù)條件概率則要用到貝葉斯公式。這類題目有時(shí)候需要一點(diǎn)直覺但更多時(shí)候是考驗(yàn)?zāi)愕挠?jì)數(shù)能力。位運(yùn)算是閱讀程序題中的常客。與、或、異或、取反、左移、右移這六種運(yùn)算的規(guī)則必須爛熟于心。特別要注意的是異或運(yùn)算滿足交換律和結(jié)合律而且一個(gè)數(shù)異或它自己等于0異或0等于它本身。這些性質(zhì)在解決“找出唯一出現(xiàn)一次的數(shù)”這類問題時(shí)非常有用。邏輯推理題通常以“真假話”或者“條件推理”的形式出現(xiàn)。做這類題的關(guān)鍵是找到矛盾點(diǎn)然后從這個(gè)矛盾點(diǎn)出發(fā)進(jìn)行假設(shè)和排除。比如如果題目中說“只有一個(gè)人說真話”那么你就可以假設(shè)某個(gè)人說真話然后看是否會(huì)導(dǎo)致矛盾。4. 實(shí)操做題流程從拿到試卷到填涂答題卡的完整步驟4.1 時(shí)間分配與答題順序的實(shí)戰(zhàn)建議CSP-S第一輪的考試時(shí)間是120分鐘滿分100分。這120分鐘怎么分配直接決定了你最終能拿多少分。我個(gè)人的建議是選擇題控制在30分鐘以內(nèi)閱讀程序題控制在50分鐘以內(nèi)完善程序題控制在30分鐘以內(nèi)最后留10分鐘檢查。答題順序方面我強(qiáng)烈建議先做選擇題再做閱讀程序題最后做完善程序題。原因是選擇題的分值雖然不高但難度相對(duì)較低先做選擇題可以快速進(jìn)入狀態(tài)同時(shí)確保基礎(chǔ)分不丟。閱讀程序題的分值高需要集中精力放在中間做比較合適。完善程序題的難度最大放在最后做即使時(shí)間不夠也可以靠蒙來拿一些分。如果你在某個(gè)題目上卡住了超過3分鐘果斷跳過先做后面的題。等所有題目都過了一遍之后再回頭來啃硬骨頭。我見過太多選手因?yàn)樵谝坏李}上死磕最后導(dǎo)致后面會(huì)做的題沒時(shí)間做這是最虧的。4.2 選擇題的快速排除法與蒙題技巧選擇題的四個(gè)選項(xiàng)中通常有兩個(gè)是明顯錯(cuò)誤的另外兩個(gè)需要你仔細(xì)辨別??焖倥懦黠@錯(cuò)誤的選項(xiàng)可以大大提高你的正確率。比如如果一道題問的是時(shí)間復(fù)雜度而選項(xiàng)中有O(n2)和O(n log n)那么你可以先根據(jù)代碼的結(jié)構(gòu)判斷大概是哪個(gè)量級(jí)然后排除掉明顯不符的選項(xiàng)。蒙題也是有技巧的。根據(jù)我的經(jīng)驗(yàn)選擇題的答案分布通常比較均勻不會(huì)出現(xiàn)連續(xù)多道題都是同一個(gè)選項(xiàng)的情況。如果你發(fā)現(xiàn)連續(xù)三道題都選了A那么第四道題大概率不是A。另外如果兩個(gè)選項(xiàng)的意思完全相反那么正確答案很可能是其中之一。對(duì)于完全不會(huì)的題目不要空著。CSP-S第一輪的選擇題是四選一蒙對(duì)的概率是25%。如果你能排除掉一個(gè)選項(xiàng)蒙對(duì)的概率就提高到33%。所以即使你完全不知道答案也要選一個(gè)不要留空。4.3 閱讀程序題的草稿紙使用規(guī)范閱讀程序題是整張?jiān)嚲碇凶钚枰莞寮埖牟糠帧N业慕ㄗh是每道閱讀程序題都畫一個(gè)表格把關(guān)鍵變量的值按照?qǐng)?zhí)行順序列出來。這樣做的好處是你可以隨時(shí)回溯檢查自己有沒有算錯(cuò)。表格的列通常包括循環(huán)變量、關(guān)鍵數(shù)組元素、以及輸出結(jié)果。行就是每次循環(huán)或者每次遞歸調(diào)用。對(duì)于遞歸程序我習(xí)慣畫一棵遞歸樹把每個(gè)節(jié)點(diǎn)的參數(shù)和返回值都標(biāo)出來。這樣即使遞歸層次很深你也能清楚地看到整個(gè)執(zhí)行過程。草稿紙的使用要有條理不要東寫一塊西寫一塊。我習(xí)慣把草稿紙對(duì)折左邊寫選擇題的演算右邊寫閱讀程序題的模擬。每道題的演算過程用橫線隔開這樣檢查的時(shí)候一目了然。4.4 完善程序題的代入驗(yàn)證法完善程序題的選項(xiàng)代入驗(yàn)證不是簡單地把選項(xiàng)讀一遍而是要在腦子里模擬程序的執(zhí)行。具體做法是把選項(xiàng)代入空白處然后從程序的開頭開始一步步執(zhí)行看看是否會(huì)出現(xiàn)邏輯錯(cuò)誤。驗(yàn)證的時(shí)候要特別注意幾個(gè)關(guān)鍵點(diǎn)循環(huán)是否能正常終止、數(shù)組下標(biāo)是否越界、變量是否在使用前被正確初始化、遞歸是否有終止條件。如果某個(gè)選項(xiàng)導(dǎo)致程序陷入死循環(huán)或者訪問了不存在的數(shù)組元素那它肯定是錯(cuò)的。另外完善程序題的空白處往往不是孤立的它和前后文有緊密的聯(lián)系。有時(shí)候前一個(gè)空白處的選擇會(huì)影響后一個(gè)空白處的答案。所以做完一道完善程序題后要把所有空白處連起來再讀一遍確保整個(gè)程序的邏輯是自洽的。5. 常見問題與排查技巧實(shí)錄5.1 為什么我的選擇題總是錯(cuò)那么多選擇題錯(cuò)得多通常有三個(gè)原因知識(shí)點(diǎn)有盲區(qū)、審題不仔細(xì)、以及計(jì)算失誤。知識(shí)點(diǎn)盲區(qū)只能靠平時(shí)積累來彌補(bǔ)建議把歷年真題中錯(cuò)過的知識(shí)點(diǎn)整理成一個(gè)錯(cuò)題本考前反復(fù)看。審題不仔細(xì)是很多選手的通病比如題目問的是“不正確”的選項(xiàng)你卻選了“正確”的。我的建議是讀題的時(shí)候把關(guān)鍵詞圈出來比如“不正確”、“最多”、“至少”等。計(jì)算失誤在進(jìn)制轉(zhuǎn)換和復(fù)雜度分析題中最為常見。避免計(jì)算失誤的方法只有一個(gè)多練。平時(shí)做練習(xí)的時(shí)候不要用計(jì)算器強(qiáng)迫自己手算。算完之后用不同的方法驗(yàn)證一遍。比如十進(jìn)制轉(zhuǎn)二進(jìn)制之后再把二進(jìn)制轉(zhuǎn)回十進(jìn)制看看是否等于原來的數(shù)。5.2 閱讀程序題模擬到一半就亂了怎么辦模擬到一半就亂了說明你的草稿紙使用方式有問題。我見過很多選手草稿紙上寫滿了數(shù)字但沒有任何結(jié)構(gòu)回頭檢查的時(shí)候根本看不懂自己寫了什么。解決方法是用表格來組織你的模擬過程每一行代表一次循環(huán)每一列代表一個(gè)變量。這樣即使模擬到后面你也能清楚地看到每個(gè)變量的變化軌跡。如果代碼的邏輯實(shí)在太繞可以嘗試把代碼翻譯成自然語言。比如把“for(int i0;in;i)”翻譯成“對(duì)于i從0到n-1每次增加1”。這樣做雖然看起來笨但能幫你理清代碼的邏輯。5.3 完善程序題的兩個(gè)選項(xiàng)看起來都對(duì)怎么辦兩個(gè)選項(xiàng)看起來都對(duì)說明你對(duì)程序的理解還不夠深入。這時(shí)候你需要從細(xì)節(jié)入手比較兩個(gè)選項(xiàng)的差異。比如一個(gè)選項(xiàng)用的是“”另一個(gè)用的是“”那么你就需要判斷在當(dāng)前的上下文中邊界條件應(yīng)該是包含還是不包含。另一個(gè)方法是代入極端情況。比如如果程序處理的是一個(gè)數(shù)組你可以假設(shè)數(shù)組只有一個(gè)元素或者數(shù)組為空然后看看哪個(gè)選項(xiàng)在這種情況下仍然能正確工作。極端情況往往能暴露出選項(xiàng)之間的本質(zhì)差異。5.4 考前一周的復(fù)習(xí)策略與心態(tài)調(diào)整考前一周不要再做新題了。把之前做過的錯(cuò)題重新過一遍確保每個(gè)錯(cuò)題背后的知識(shí)點(diǎn)都已經(jīng)掌握。同時(shí)把CSP-S的考試大綱拿出來對(duì)照著檢查自己有沒有遺漏的知識(shí)點(diǎn)。心態(tài)方面不要給自己太大壓力。CSP-S第一輪雖然重要但它不是終點(diǎn)。即使這次沒考好后面還有機(jī)會(huì)??荚嚽耙惶焱砩显琰c(diǎn)休息保證充足的睡眠??荚嚠?dāng)天提前到達(dá)考場帶齊證件和文具。提示考試時(shí)如果感到緊張可以深呼吸幾次或者閉上眼睛休息10秒鐘。這能幫你快速恢復(fù)狀態(tài)。5.5 常見問題速查表問題可能原因解決方法選擇題正確率低知識(shí)點(diǎn)盲區(qū)、審題不仔細(xì)整理錯(cuò)題本、圈畫關(guān)鍵詞閱讀程序題模擬混亂草稿紙使用不當(dāng)用表格組織模擬過程完善程序題二選一總是錯(cuò)對(duì)程序理解不深代入極端情況驗(yàn)證時(shí)間不夠用在某道題上死磕果斷跳過先做后面的題進(jìn)制轉(zhuǎn)換總算錯(cuò)練習(xí)量不夠每天練10道進(jìn)制轉(zhuǎn)換題復(fù)雜度分析沒思路對(duì)循環(huán)結(jié)構(gòu)不敏感多分析經(jīng)典算法的時(shí)間復(fù)雜度6. 從這份試題延伸出去如何用Markdown源碼搭建自己的復(fù)習(xí)體系6.1 把試題源碼變成個(gè)人知識(shí)庫的實(shí)操方法拿到Markdown源碼之后不要只是把它當(dāng)成一份電子版試卷。你可以把它導(dǎo)入到Obsidian、Notion或者任何支持Markdown的筆記軟件中然后按照知識(shí)點(diǎn)重新組織。比如把所有涉及二叉樹的題目放在一起把所有涉及動(dòng)態(tài)規(guī)劃的題目放在一起。這樣復(fù)習(xí)的時(shí)候你就能清楚地看到每個(gè)知識(shí)點(diǎn)的考查方式和難度變化。我個(gè)人的做法是給每道題打上標(biāo)簽比如“#二叉樹”、“#時(shí)間復(fù)雜度”、“#易錯(cuò)”。然后利用筆記軟件的搜索功能快速找到某一類題目。這樣做的好處是考前復(fù)習(xí)的時(shí)候你可以針對(duì)自己的薄弱環(huán)節(jié)進(jìn)行專項(xiàng)訓(xùn)練而不是盲目地刷整套卷子。6.2 用Git管理試題源碼的版本如果你有編程基礎(chǔ)我強(qiáng)烈建議用Git來管理你的試題源碼。每做一遍試題就提交一次commit message寫清楚這次做題的日期和得分。這樣過一段時(shí)間之后你可以用git log查看自己的進(jìn)步軌跡也可以用git diff比較不同版本的答案看看自己的思路發(fā)生了哪些變化。具體操作很簡單先創(chuàng)建一個(gè)倉庫把試題的Markdown源碼放進(jìn)去然后每次做完題之后把答案和解析也加進(jìn)去提交一次。如果你愿意還可以把倉庫托管到GitHub或者Gitee上這樣即使換電腦也能隨時(shí)訪問自己的復(fù)習(xí)資料。6.3 基于試題源碼的二次創(chuàng)作與分享這份試題的Markdown源碼還有一個(gè)用途二次創(chuàng)作。你可以把題目重新排版加上自己的解析和心得然后分享給其他選手。分享的過程本身就是一種復(fù)習(xí)因?yàn)槟阋阎R(shí)講清楚就必須先自己理解透徹。我認(rèn)識(shí)一位選手他把每道題的解析都寫成了一篇小短文發(fā)在自己的博客上。一年下來不僅自己的水平提高了還積累了一批讀者。后來他參加競賽的時(shí)候這些博客文章成了他最好的復(fù)習(xí)資料。6.4 從第一輪到第二輪后續(xù)學(xué)習(xí)路徑規(guī)劃第一輪只是起點(diǎn)真正的挑戰(zhàn)在第二輪。通過第一輪之后你應(yīng)該把主要精力放在算法實(shí)現(xiàn)和代碼調(diào)試上。建議從以下幾個(gè)方面入手第一把歷年第二輪的真題做一遍熟悉考試形式和難度第二針對(duì)自己的薄弱算法進(jìn)行專項(xiàng)訓(xùn)練比如動(dòng)態(tài)規(guī)劃、圖論、字符串處理等第三多參加模擬賽鍛煉在壓力下寫代碼的能力。如果你在第一輪中發(fā)現(xiàn)自己對(duì)某些知識(shí)點(diǎn)理解不夠深比如動(dòng)態(tài)規(guī)劃或者圖論那么在第一輪結(jié)束到第二輪開始之間的這段時(shí)間就是補(bǔ)短板的最佳時(shí)機(jī)。不要等到第二輪考試前才臨時(shí)抱佛腳那時(shí)候時(shí)間根本不夠用。我個(gè)人在實(shí)際操作中的體會(huì)是第一輪的復(fù)習(xí)材料不需要多但一定要精。一份帶詳細(xì)解析和源碼的試題如果能把每道題都吃透比刷十份沒有解析的試題效果要好得多。關(guān)鍵不在于你做了多少題而在于你從每道題中學(xué)到了什么。