今天開個坑,分類整理PAT甲級題目(https://pintia.cn/problem-sets/994805342720868352/problems/type/7)中1051~1100部分。語言是modern C++。
為什么要整理呢,因為我2019年9月要考PAT甲級,雖然是第一次考,雖然只學了數據結構(https://mooc.study.163.com/course/1000033001?tid=2402970002#/info),但我要沖着高分(2019年9月8日更新:滿分)去。
下面的表格簡述了這50道題的大意,並進行了分類。
| 題號 | 標題 | 分數 | 大意 | 類型 |
| 1051 | Pop Sequence | 25 | 判斷一個序列是否是pop序列 | 理論 |
| 1052 | Linked List Sorting | 25 | 鏈表排序 | 理論 |
| 1053 | Path of Equal Weight | 30 | 尋找樹中一定權重的路徑 | 樹 |
| 1054 | The Dominant Color | 20 | 尋找出現最多的數 | 線性 |
| 1055 | The World's Richest | 25 | 限定范圍排序結果 | 排序 |
| 1056 | Mice and Rice | 25 | 分組排序 | 排序 |
| 1057 | Stack | 30 | 一個有中位數功能的stack | 理論 |
| 1058 | A+B in Hogwarts | 20 | 特殊進制加法 | 計算 |
| 1059 | Prime Factors | 25 | 分解素因數 | 計算 |
| 1060 | Are They Equal | 25 | 一定精度下兩數是否相等 | 計算 |
| 1061 | Dating | 20 | 尋找字符串中相同字符 | 線性 |
| 1062 | Talent and Virtue | 25 | 一定規則的排序 | 排序 |
| 1063 | Set Similarity | 25 | 集合相似度 | 集合 |
| 1064 | Complete Binary Search Tree | 30 | 完全二叉搜索樹 | 樹 |
| 1065 | A+B and C (64bit) | 20 | 大數加法與比較 | 計算 |
| 1066 | Root of AVL Tree | 25 | AVL樹的根 | 樹 |
| 1067 | Sort with Swap(0, i) | 25 | 通過與0號元素交換來排序 | 數學 |
| 1068 | Find More Coins | 30 | 子集和問題 | 算法 |
| 1069 | The Black Hole of Numbers | 20 | 黑洞數 | 計算 |
| 1070 | Mooncake | 25 | 背包問題 | 算法 |
| 1071 | Speech Patterns | 25 | 尋找出現最多的單詞 | 線性 |
| 1072 | Gas Station | 30 | 最短距離最大,距離不超限 | 圖 |
| 1073 | Scientific Notation | 20 | 科學計數法還原 | 計算 |
| 1074 | Reversing Linked List | 25 | 分段逆轉鏈表 | 理論 |
| 1075 | PAT Judge | 25 | 復雜排序 | 排序 |
| 1076 | Forwards on Weibo | 30 | 一定層數的轉發計數 | 圖 |
| 1077 | Kuchiguse | 20 | 字符串共同后綴 | 線性 |
| 1078 | Hashing | 25 | 散列 | 散列 |
| 1079 | Total Sales of Supply Chain | 25 | 計算供應鏈總銷售額 | 圖 |
| 1080 | Graduate Admission | 30 | 志願與錄取 | 排序 |
| 1081 | Rational Sum | 20 | 有理數加法 | 計算 |
| 1082 | Read Number in Chinese | 25 | 中文讀數 | 線性 |
| 1083 | List Grades | 25 | 限定范圍排序結果 | 排序 |
| 1084 | Broken Keyboard | 20 | 比較兩序列的差異 | 線性 |
| 1085 | Perfect Sequence | 25 | 符合約束的最大數列長度 | 集合 |
| 1086 | Tree Traversals Again | 25 | 中序遍歷逆推 | 樹 |
| 1087 | All Roads Lead to Rome | 30 | 復雜權重的最短路徑問題 | 圖 |
| 1088 | Rational Arithmetic | 20 | 有理數運算 | 計算 |
| 1089 | Insert or Merge | 25 | 判斷插入排序或歸並排序 | 理論 |
| 1090 | Highest Price in Supply Chain | 25 | 供應鏈最高價格 | 圖 |
| 1091 | Acute Stroke | 30 | 超過閾值的空間體積之和 | 圖 |
| 1092 | To Buy or Not to Buy | 20 | 判斷子集 | 集合 |
| 1093 | Count PAT's | 25 | 數子串 | 數學 |
| 1094 | The Largest Generation | 25 | 樹中元素最多的層 | 樹 |
| 1095 | Cars on Campus | 30 | 模擬車輛進出 | 線性 |
| 1096 | Consecutive Factors | 20 | 最長連續因數 | 計算 |
| 1097 | Deduplication on a Linked List | 25 | 鏈表去重 | 理論 |
| 1098 | Insertion or Heap Sort | 25 | 判斷插入排序或堆排序 | 理論 |
| 1099 | Build A Binary Search Tree | 30 | 建立二叉搜索樹 | 樹 |
| 1100 | Mars Numbers | 20 | 進制轉換 | 計算 |
一共分了10類:
計算,一些純數學計算的題,如進制轉換;
線性,算法時間復雜度為常數或線性的題,如字符串類;
理論,以理論為背景的題,如鏈表操作、判斷何種排序算法;
集合,以集合為主要工具的題;
樹,以樹為背景或主要工具的題;
圖,需要建立圖的題;
排序,純排序題;
散列,涉及到散列的題;
數學,需要組合數學知識的題;
算法,用到算法設計課程中強調的算法的題,如貪心算法。
一些題目比較少的類別可能會並在一起講。此外,我發現有些知識點在這50道題里面沒有出現過(目前發現,我只粗略地看過一遍),可能會有一篇文章來補充。
每種類型的題目我會總結共性,簡述可能的變形,最后挑一兩道較難的放上代碼。
最后說一下筆者的編碼習慣。
喜歡C++11,幾乎沒有一道題我的代碼是可以在C++98/03的標准下通過的。有時候我會忘記一個特性是不是來自C++14/17,但是我保證此系列中所有代碼都可以在PAT OJ的g++編譯器中通過編譯並AC。
喜歡換行。左右大括號都獨占一行,沒有大括號的if、while、for等block會換行並縮進。
喜歡用 std::vector ,幾乎不會根據輸入上限建立數組。這是因為我是玩單片機的,沒那么多內存可以浪費。 std::vector 在初始化時確定好大小或用 reserve(...) 分配好空間后效率還是可以的。
喜歡用 std::cin 和 std::cout 做輸入輸出,因為我沒參加過計算機競賽,沒遇到過嚴格的時間限制。既然C++提供了類型安全的輸入輸出方式,那就用。
喜歡用C++中各種“++”的部分。按使用率從高到低排序應該是類、運算符重載、模板、繼承。關於繼承我以后會單獨開一個專題系列。
我自認為我的代碼是現代的、優雅的。如果你有辦法讓我的代碼更優雅,歡迎評論。這種優雅確實會帶來一定的代碼膨脹與性能損失,如果你受不了,可以去參考別人的代碼。
文章鏈接(已完結):
