2021.9.12週六PAT甲級考試覆盤與總結

Piper蛋窩發表於2021-09-12

週六PAT甲級考試覆盤與總結

先說結論:仍未步入“高手”行列;現在的學習節奏與方法是對的,有十萬分的必要堅持下去。

題目 知識點 分數
T1 字首和、二分 11 / 20
T2 排序 25 / 25
T3 圖論 17 / 25
T4 二叉樹(根據中序遍歷建樹) 30 / 30
總分 // 83 / 100

題目很簡單,總體來講極其可惜: T1 和 T3 考試時實在沒有找到 bug 出在哪裡,目前 T1 的 bug 已經找到,我們先且覆盤考試。

覆盤

浙江大學計算機程式設計能力考試(Programming Ability Test,簡稱PAT),據說浙江大學 CS 平均分 70 分,於是我也想試試。

考完試我覺得這個 70 分沒有什麼意義:

  • 首先,本次這四道題目極其簡單
  • 其次, CS 的學生也並非有平日練習資料結構演算法題的習慣,演算法這個東西,大部分題目:「無他,唯手熟爾」

這次考 83 分十分可惜,可惜在題目太簡單了,最後半小時,我就在死死盯著螢幕:邏輯上沒問題啊?而且測試用例都通過了,怎麼就有判分用例過不去呢?

昨天晚上睡前刷了刷知乎,果然大家都是甲級滿分...恍然大悟 T1 在哪出了問題。

經驗1:認真讀題,不可臆測

第一題說:計算機儲存一個陣列,未必要在物理空間裡申請一段連續的地址。

比如一個 int (32 bit) 陣列長度為 20 ,其地址可能是:

// 首地址 元素個數
1024 10
0 5
2048 5

給我詢問,問我第幾個元素的地址是多少。

很簡單的查詢問題,怕超時,我還寫了字首和和二分(實際上知乎上說直接暴力列舉找都不會超時...)。

這題有兩個坑點,我考試時全踩了:

  • 最後問我,開了多少個記憶體空間?
    • 我以為,比如一共查詢了兩個數 019 ,那就妥妥地用到 1024 這塊還有 2048 這塊返回 2 唄;於是寫個 bool used[N]; 計數
    • 結果著實被教育了一把:你要開到 19019 之間的不開嗎?因此你返回查詢過的最大記憶體塊編號就行了
  • 如果查詢全部越界,你也得返回 1 個地址空間而不是 0
    • 我已經看不到題目了,但是據說題目中其實寫了:至少開一塊地址空間

這就很服氣,原來一直以來,都是題目理解錯了;而我一直以為是自己的邏輯問題,沒有再讀題。

PAT 甲級題目都是英文的,確實很考英文閱讀理解。

經驗2:繼續刷題,打出自信

其實 T1 都錯題也有自己不自信的鍋:

  • 邏輯是對的,但我非得認為“一定是自己哪裡寫的有疏漏”
  • 如果我能咬定:“好,邏輯沒問題了,我去再讀一遍題目”,那將會是截然不同的結果

y 總就有這個自信,他講過的每道題都會先說思路,然後親手敲一遍,最後現場 debug 。自信來自於實力強大,如果我能強大到:『這個思路,這個實現,就沒問題!如果出錯了,一定是題目沒理解對!』自然也不會有本次考試的可惜。

T3 我也沒做成滿分,我懷疑是 dfs 寫得不好,週日上午打力扣也是,比完才意識到 dfs 有邏輯漏洞。我現在已經無法再看到當時的題目和程式碼了,也沒必要糾結,再多做遞迴題目就是了。

經驗3:複習沒用,繼續開眼

前 3 道題做的不好,於是跳到 T4 。

當時很慌,看到 T4 更慌了:靠,我要是考前複習下建樹多好。

我除了 8 月份簡單捋過兩個序列遍歷建樹的程式碼就沒再想過了。也確實沒空。

但是記住了一條核心原則:有了中序遍歷序列,則可以找到中心點,然後遞迴下去。

8月17號關於這部分的筆記

於是硬著頭皮,竟然寫出來了, 30 分滿分。遞迴真的很神奇,覺得演算法可能有點麻煩,但是寫的時候才發現遞迴幫我們把好多邏輯自動實現了。

因此現在更應該:

  • 把複習的時間更多地花在重新整理題上
  • 好好記筆記,好好總結,爭取學一遍就有學懂學透,少被模板,多理解核心思路,省著以後再回來看

總結

強烈給大家推薦 y 總的 PAT 課,雖然我算是他比較差的學生了(感覺很多人考了滿分):AcWing.com PAT甲級輔導課

我 8 月 9 號買的, 9 月 6 號刷完,之後就沒怎麼碰過了。收穫不小,關於演算法細節的我們們以後慢慢嘮。

演算法這部分,上述三個經驗總結起來,就一句話:現在的學習節奏與方法是對的,有十萬分的必要堅持下去! 現在的學習節奏與方法是對的,有十萬分的必要堅持下去! 現在的學習節奏與方法是對的,有十萬分的必要堅持下去!

接下來準備幹掉 y 總的演算法提高課和演算法競賽進階指南,這兩節課內容太多了,先挑重點攻破吧!

相關文章