ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PAT乙级1051-1100复盘:字符串处理与模拟题的应试要点

2026/10/8 3:41:26 拓冰建站 浏览量
PAT乙级1051-1100复盘:字符串处理与模拟题的应试要点 “刷到PAT乙级1051意味着你已经把前半段的语法题啃完了接下来这50道题才是真正筛选人的部分。”这是我每次推荐朋友备考PAT乙级时习惯说的一句话。1051~1100这个区间覆盖了从字符串处理、场景模拟到数学、排序、简单数据结构几乎所有的核心考点而且命题风格跟前半段有明显差异——它不再只是“给你一个输入按公式输出”而是“给你一段真实场景描述让你用程序把规则翻译出来”。这篇文章就是针对PAT乙级1051~1100这50道题的一份复盘笔记。适合两类人一类是刷完了1001~1050、正准备进入后半段的新手另一类是已经刷完一遍但总在某个坑里反复栽跟头的考生。我会按知识点、刷题顺序、高频错误三个维度来拆尽量讲清楚“为什么这样写”而不是只丢答案。如果你正卡在这段题上相信我问题通常不是代码能力而是对题目的拆解方式还没到位。1. 1051到1100这段题到底在考什么1.1 一段话概括这50道题的构成如果只看题型分布1051~1100里大概有20道左右是纯模拟题15道左右是字符串处理题10道左右是数学题剩下的是排序和查找。这个比例跟前面50道有明显区别前半段你还能靠“背模板”混过去后半段几乎每一题都需要你先读懂规则再动手写代码。模拟题的代表是1067试密码、1069微博转发抽奖、1072开学寄语、1076Wifi密码。这类题的算法含量几乎为零难的是你能不能把题目里的中文条件完整转成程序逻辑别漏掉任何一条限制。字符串题的代表是1054求平均值、1078压缩解压、1079延迟回文数、1094谷歌的招聘。数学题的代表是1062最简分数、1091自守数、1099性感素数。排序题的代表是1085PAT单位排行、1095解码PAT准考证。这个分布其实跟PAT乙级官方考纲高度一致不考复杂算法但要求你会用常见的库函数、会写结构体、会处理边界情况。1.2 为什么说这段题是乙级的分水岭我见过不少考生1001到1050刷得飞起一进1051就卡住。原因不是题目变难了而是题目“变长了”。前半段的题描述往往三五行就结束后半段经常是一大段场景介绍比如试密码、微博抽奖、危险品装箱光读懂题目就得花好几分钟。另一个原因是1051~1100这个区间大量考察“读入格式”。题目会刻意把输入设计成容易写错的样子比如1067试密码的输入密码可能带空格1075链表节点顺序是乱的1074加法器的进制表是倒着给的。这些设计都是为了让你养成“先把数据组织好再处理逻辑”的习惯。从我带过的备考者来看能把这段题刷顺的人至少掌握了三件事C的string和getline用得熟结构体排序的写法不需要查百度看到“边界条件”四个字会本能地警惕起来。只要这三点到位应试能力会发生质变。1.3 命题人的偏爱真实场景包装后半段题目特别爱用现实场景做马甲这其实是一把双刃剑。好处是题目不容易枯燥坏处是很多考生被场景描述带偏把注意力放在“这个场景该怎么仿真”上反而忽略了考点本身。比如1089狼人杀表面上是推理游戏实际就是枚举两个狼人再按每句话去验证谁说谎1090危险品装箱表面上是物流场景实际就是map加集合做配对检查1100校庆是身份证和日期比较本质就是字符串排序。我每次都会跟人说一句话先透过场景找考点别陷进场景里当编剧。2. 字符串与场景模拟这50题的主战场2.1 字符串题的核心套路这50题里的字符串题变化很多但底层就四个套路分割、替换、匹配、大数处理。先看分割。1081检查密码要逐字符判断类型1084外观数列要按连续相同字符分段1093字符串AB要处理去重顺序。分割题最常见的错误是忘记处理字符串末尾的边界。比如1084这种题经常需要你在循环结束后再手动处理最后一段如果不补这个操作结果就少一位。再看替换和匹配。1078字符串压缩与解压是个典型压缩时统计连续字符数量解压时把数字后的字符按次数展开。这题有两个坑一是解压时数字可能多位数不能只用一位char去存二是解压语句里可能包含空格所以读取整行时要用getline。如果你只会用cin这题必栽。大数处理是很少被新手重视的隐藏考点。1079延迟的回文数要求对1000位以内的整数做加法这绝对不能转成整型或者浮点型必须用字符串逐位相加。1074宇宙无敌加法器更特殊每一位的进制都可能不同你得倒着遍历进制表同时处理进位。这两个题能顺利通过就说明你对“字符串模拟数值”已经过关了。2.2 数字与字符串的边界处理很多题不是难在正则逻辑而是难在“输出什么、不输出什么”。1054求平均值就是一个经典例子。题目会让你判断一串输入里有多少个合法数字然后求平均。合法的条件包括只能有数字、一个小数点、负号只能在开头、小数点后最多两位、数值范围要落在[-1000, 1000]之间。但真正折磨人的是单复数输出只有一个合法数字时输出是“The average of 1 number is ...”多个时是“numbers”一个都没有时是“The average of 0 numbers is Undefined”。这个单词s我敢说到最后上考场还有不少人记错。解决的办法只有一个在提交前逐字读一遍题目样例把这类细节点当成代码的一部分写下来而不是靠临场发挥。再比如1074加法器最后输出结果时要去掉前导0但如果结果本身是0必须输出一个0而不是空行。这规则听上去很简单但实际提交时“答案错误”十有八九就是栽在这里。我的习惯是写完主逻辑后单独再写几行判断专门处理“结果全为0”的情况。2.3 场景模拟题的读题技巧场景模拟题考的不是算法而是严谨。1067试密码就是最好的一课。这题的输入密码可能包含空格正确读法是用getline如果尝试次数达到上限还没答对要立即输出“Account locked”并退出此时哪怕后面还有输入行也不用管。另外要注意如果你用cin 尝试密码读到空格就会断后续逻辑全崩。1069微博转发抽奖的坑在“顺延”。中奖者已经中过奖就得往下顺延一位而不是跳过中间所有已中奖的人。1075链表元素分类则要求你按首地址开始“串”链表忽略那些不在链表里的散乱节点。做这类题时我给你一个笨但有效的建议把题目里的每一句话编号读完一遍后在草稿纸上写出输入、输出和终止条件再开始写代码。这个过程看着浪费时间实际能帮你把“题目读懂”和“代码写完”之间的距离缩到最短。3. 数学题与排序题拉开差距的地方3.1 必背的数学板子1051~1100的数学题不难但很考验敏感度。你必须拿到题就能反应出来这题用素数判断、那题用最大公约数、这道用进制转换。我建议把这几个板子背成肌肉记忆。素数判断是出现频率最高的。1094谷歌的招聘要在字符串里找K位素数1099性感素数要判断相差6的素数对1059C语言竞赛里要根据排名发奖品。标准写法如下bool isPrime(int n) { if (n 2) return false; for (int i 2; i * i n; i) { if (n % i 0) return false; } return true; }最大公约数gcd用辗转相除推荐直接用C标准库的std::__gcd或者自己写三行int gcd(int a, int b) { return b 0 ? a : gcd(b, a % b); }1062最简分数就需要用它判断分子分母是否互质。另外还有一个容易被忽略的板子把一个分数化成最简形式时分子分母要同时除以它们的gcd并且处理负数符号这些都是老考生闭着眼都能写的操作。1099性感素数有个特别坑的边界如果n本身不是素数直接判No如果n是素数但n-6和n6都不是素数也是No需要输出大于n的最小性感素数时除了检查m本身是素数还得检查m-6或m6是素数且大于等于2才算。我第一次写这个题只检查了m-6漏了m6的情况白白交了好几次。3.2 排序题的通用结构统计题、排名题、单位汇总题基本都是同一个套路读入数据存进结构体用一个map做聚合然后转成vector排序最后按规则输出。1085PAT单位排行和1095解码PAT准考证是把这套流程用到极致的题目。结构体排序的核心是写清楚cmp函数。建议养成一个习惯排序优先级多的比较用嵌套return写别搞一长串难以阅读的表达式。比如1085的排序规则是总分降序、人数升序、学校名小写字典序代码可以这样组织bool cmp(const School a, const School b) { if (a.score ! b.score) return a.score b.score; if (a.num ! b.num) return a.num b.num; return a.name b.name; }还有个细节1085里的学校名需要转成小写再统计。很多人会用tolower逐字符处理这没问题但要注意tolower返回的是int如果直接赋给char也完全合法。另一个细节是加权总分计算甲级1.5分、乙级1分、顶级1分三种分数加权后累加最后取整。取整不是四舍五入而是直接向零方向截断用int强转就行。3.3 组合枚举题的暴力美学后半段有好几道题看起来像推理题实际上就是暴力枚举。1089狼人杀-简单版就是最典型的。N最多100个人你可以直接枚举哪两个是狼人然后模拟每个人说的话检查说谎者数量是否等于2、且其中有一个狼人、一个好人。复杂度O(n^3)也完全扛得住。1096大美数的思路也类似先把N的所有因子找出来如果因子数不足4个直接判定不行然后在因子集合里做四层循环检查是否存在四个不同因子使它们的和能被N整除。你可能会觉得四层循环太暴力但因子数量其实很少实测完全没问题。这类题给了一个重要启示乙级的题面看起来复杂但数据范围通常给得很小。拿到题先看N的范围如果N小于等于100暴力往往就是最优解。别一上来就想着优化、剪枝、记忆化搜索乙级根本不需要。4. 从1051刷到1100的实操路线4.1 别按题号顺序刷我知道很多人习惯从1051顺着刷到1100但我更推荐按知识点分梯队刷。原因很简单前半段每一题的独立性很强后半段很多题之间是共享套路。第一梯队可以先刷基础模拟和字符串题比如1054求平均值、1057数零壹、1061判断题、1063计算谱半径、1064朋友数、1066图像过滤、1072开学寄语、1076Wifi密码、1082射击比赛、1083是否存在相等的差、1086就不告诉你、1087有多少不同的值、1091自守数、1092最好吃的月饼、1093字符串AB。这些题能快速建立信心同时让你熟悉cin、getline、printf、map这些工具混用的手感。第二梯队刷经典数学和排序题包括1062最简分数、1065单身狗、1067试密码、1068万绿丛中一点红、1070结绳、1071小赌怡情、1078压缩解压、1079延迟回文数、1081检查密码、1084外观数列、1088三人行、1094谷歌的招聘、1099性感素数、1100校庆。这些题需要你认真分析每一道都值得写进错题本。第三梯队才是真正费脑子的包括1059C语言竞赛、1060爱丁顿数、1069微博转发抽奖、1073多选题常见计分法、1074宇宙无敌加法器、1075链表元素分类、1080MOOC期终成绩、1085PAT单位排行、1089狼人杀、1090危险品装箱、1095解码PAT准考证。把第三梯队刷完整个乙级题库你就基本覆盖了。4.2 每天刷多少题合适这个问题没有标准答案但我可以把不同情况的节奏给你参考。如果你是在校生每天能拿出两小时我建议两天刷三道题第一天一道新题加复盘一道旧题第二天两道新题。不要图快关键是每道题都要“带着脑子AC”要知道自己为什么错是读题漏条件还是代码边界没处理好。如果你已经刷完一遍、临近考试我建议你把这50题重新过一遍但方式改成“限时模拟”。随机抽四道题计时90分钟完全模拟考场的状态。这套方法比盲目刷新题有用得多因为你在模拟中会暴露时间分配的问题这恰恰是很多人真正的痛点。4.3 如何做有效的错题复盘复盘不是把正确答案抄一遍而是要记录三个东西错因、考点、重写的思路。我自己的模板很简单错因分类读题漏条件 / 输出格式错 / 边界数据错 / 代码逻辑Bug / 编译器用法不熟对应考点字符串 / 模拟 / 数学 / 排序 / 数据结构一句话总结比如“1074进制表是倒着存的下次先reverse再处理”记录完后隔一周再做一遍。如果你能连续三次不看答案全对这题才算真正过关。很多人复盘的误区是只看不写这毫无意义编程是手上的功夫不是眼睛的功夫。5. 高频踩坑与自查清单5.1 五个让我印象最深的坑第一个坑是1054的单复数。题目里的有效数字只有一个时number不要加s零个时却要用numbers。这种细节没有技术含量但每次都能淘汰一批人。我的建议是在代码顶部注释里写上“注意单复数”提交前扫一眼。第二个坑是1067的输入方式。试密码的输入可能带空格用cin会把一行拆成好几段。必须用getline(cin, s)。还有一个点当尝试次数达到上限时系统立刻锁定后续输入不再判断。这两个点单独拿出来都不难但合在一起错的人就多了。第三个坑是1074加法器的进制表。题目把一个20位的进制表写在一行字符串里第一位对应个位所以处理时最好把两个加数逆序再从下标0开始做逐位相加。进制表中的0表示十进制10不是0进制。最后输出时要去掉前导0但0本身要输出一个0。第四个坑是1075链表的无效节点。题目会给出一堆节点但只有从首地址一路next走到的节点才属于这条链表。很多考生直接把所有节点排序输出结果把不在链表里的节点也输出了。正确做法是先根据首地址和next数组串出有效链表顺序再按规则分类。最后输出的地址要补足5位但-1不用补零。第五个坑是1085加权总分的取整方式。甲级1.5分累加时是每个人单独的加权成绩参与累加最后统一取整不是先取整再累加。这个顺序影响很大我第一次就是因为这个细节错了两个测试点。请记住先全部累加最后强转int。5.2 输出格式自查清单PAT这类在线评测对输出格式极其严格多一个空格、少一个换行都可能判“格式错误”。我整理了一个检查清单每次提交前过一遍行末有没有多输出空格尤其是循环打印数字的场景建议先拼字符串再统一输出或者用printf(%d%c, x, i n-1 ? \n : )地址、日期、时间类的数字要补前导零比如地址用%05d时间用%02d浮点数保留两位小数用printf(%.2f)注意是四舍五入和上面说的整数取整不一样字符串比较大小写是否敏感比如1085要求学校名小写后按字典序1100的身份证号是字符串直接比较输出结束后是否要换行PAT一般允许行末有换行但我习惯每条输出都带换行5.3 调试技巧和错误征兆遇到“答案错误”别急着改代码先看是哪个测试点挂了。PAT的在线评测一般会告诉你通过了几个、错在哪个测试点这个信息非常宝贵。比如最后一个测试点是边界大数那就很可能不是逻辑错而是数据类型溢出、数组长度不够、或者补零问题。段错误最常见的原因是数组越界。如果你用了长度100的数组但实际访问了下标105就会段错误。另一个常见原因是vector为空时取下标或者访问了map里不存在的键。运行超时往往意味着死循环或复杂度太高。乙级题里如果出现运行超时先检查是不是某个while循环的条件写错了比如忘了递增变量或者while(1)却没有break。真正需要算法优化的情况极少别一看到超时就往复杂的方向想。我还有一个“土办法”写代码时多输出中间结果AC后再删掉这些调试语句。很多人视调试为大忌其实调试只是让代码“边说边做”效率反而高得多。6. 这段题刷完我真正学到的东西刷完1051~1100我最大的收获不是会写某道题而是养成了一套对待“不可靠输入”的思维方式。现实里的业务代码输入的脏数据远比PAT的测试点离谱字段可能缺失、格式可能混乱、类型可能错误。这段题正是用一道又一道模拟题反复训练你先检查输入合法性再处理业务逻辑先考虑边界情况再优化主流程。就像1075链表元素分类它训练的不是“你会不会排序”而是“你能不能在一堆散乱的数据里按线索把它们重新串成一条有序结构”。这种能力写业务代码时每天都在用只是换了场景。如果你现在刷到这段题觉得吃力别焦虑。把你错得最多的那几类题挑出来集中过一遍你会发现规律极其明显。尤其是“输出格式”“边界条件”“输入读取方式”这三个滑铁卢重灾区花一个下午专门整理一次胜过闷头刷一星期。最后分享一个小技巧每道题AC之后在代码开头的注释里用一句话写下这道题最容易被坑的地方。比如“1067密码可能带空格用getline达到次数上限后立刻锁定”。等到考前回顾你根本不看整段代码只看这一行注释效率高得惊人。这50道题的价值从来不只是帮你应付一场考试。它们真正训练的是把模糊需求翻译成精确逻辑的能力而这种能力走到哪里都用得上。