今天開個坑,分類整理PAT甲級題目(https://pintia.cn/problem-sets/994805342720868352/problems/type/7)中1051~1100部分。語言是modern C++。html
爲何要整理呢,由於我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類:安全
計算,一些純數學計算的題,如進制轉換;數據結構
線性,算法時間複雜度爲常數或線性的題,如字符串類;工具
理論,以理論爲背景的題,如鏈表操做、判斷何種排序算法;性能
集合,以集合爲主要工具的題;ui
樹,以樹爲背景或主要工具的題;編碼
圖,須要創建圖的題;spa
排序,純排序題;
散列,涉及到散列的題;
數學,須要組合數學知識的題;
算法,用到算法設計課程中強調的算法的題,如貪心算法。
一些題目比較少的類別可能會並在一塊兒講。此外,我發現有些知識點在這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++中各類「++」的部分。按使用率從高到低排序應該是類、運算符重載、模板、繼承。關於繼承我之後會單獨開一個專題系列。
我自認爲個人代碼是現代的、優雅的。若是你有辦法讓個人代碼更優雅,歡迎評論。這種優雅確實會帶來必定的代碼膨脹與性能損失,若是你受不了,能夠去參考別人的代碼。
文章連接(已完結):