1. 从一道Lv.1说起为什么我建议你把蓝桥云课的入门题刷完上午十点我照例打开蓝桥云课把Lv.1难度里还没做完的题目拉出来过了一遍。说来有意思很多人一上来就盯着省赛、国赛真题刷觉得入门题太简单、没技术含量。但以我带过的几届参赛同学和身边搞竞赛的朋友的经验看恰恰是这些Lv.1题目最能暴露问题——不是会不会写代码的问题而是读题习惯、边界处理、基础语法熟练度这些底层能力的问题。我自己的经历也差不多。前年带一个零基础的学生备赛他急着做算法题我硬是按住他先在Lv.1刷了将近两个星期。刚开始他不理解觉得浪费时间后来正式开始刷真题的时候他跟我说了一句让我印象很深的话那些看起来太简单的题其实把循环、数组、字符串处理这些基本功打得很扎实后面写中等题的时候脑子里不会因为语法卡壳能腾出精力去真正想算法。所以这次day27打卡我选的任务就是蓝桥云课Lv.1难度中的绝大部分题目目标是彻底清空入门阶段的基础题。这篇文章我会把这一天的完整刷题过程、思路拆解、代码实现和踩坑记录都整理出来给同样在备赛或者想夯实基础的朋友做一个参考。2. 先搞清楚Lv.1在考什么难度定级背后的能力模型2.1 Lv.1题目的本质不是思维题是熟练度题我在群里经常看到有人问Lv.1的题到底该不该刷刷多少算够先给结论如果你目标是省三及以上Lv.1中绝大部分题都应该能稳定快速通过如果你目标是国赛Lv.1这类题要做到基本不动脑子就能写出来。为什么这么说因为Lv.1题目考察的核心不是算法思维而是四样东西输入输出的格式处理很多新手挂在这种地方数据读进来类型不对、多余空格没处理、换行符干扰。基础语法熟练度for循环、while循环、数组遍历、字符串切片、字典/哈希表的简单使用。边界条件意识循环边界、数组越界、空输入、整除为0、取模负数等。代码实现的准确率一次通过率而不是调试半天。从蓝桥云课的题目分布来看Lv.1覆盖的知识点集中在顺序结构、分支结构、循环结构、一维数组、简单字符串处理、基础数学运算、简单模拟。难一点的会到枚举和一点贪心思想的萌芽但基本不会到DP、图论、搜索这些层级。所以当一个人Lv.1刷得不顺手的时候问题往往不在算法思维而在代码落地能力。放到备赛节奏里Lv.1就是那个地基地基不牢后面刷Lv.2、Lv.3的时候会特别痛苦。2.2 大部分题 vs 全部题我的取舍原则标题里说的是绝大部分题我确实没有强迫症到把所有题都刷一遍。在Lv.1里会有少量题目存在明显的问题——数据范围描述模糊、样例输出有歧义、或者纯粹是重复度极高的同类题。我的取舍原则很简单如果一道题的核心考察点和另一道题高度重复且我已经能稳定通过那么后出现的那道可以直接跳过记录题号即可。如果一道题读了两遍还不确定它在问什么先标记下来去评论区看看大家怎么理解的再决定是做还是放。如果一道题有明显的平台数据问题比如同样的代码提交两次结果不同直接跳过不纠结。毕竟刷题的目的是提升能力不是为了那个全部完成的进度条。把时间和精力花在能带来提升的题上这才是刷题的正确姿势。2.3 给零基础朋友的能力自测清单在正式进入题目之前先对照这份清单看看自己的情况。如果你能轻松完成下面这些任务Lv.1的绝大部分题对你来说就是熟练度问题不是能力问题能在3分钟之内写一个循环读入多行整数并求和的程序。能熟练用两种以上方式遍历一个数组并找到最大值。能正确处理字符串反转、大小写转换、去除空格这类操作。能解释清楚range(5)和range(1, 5)的区别并正确输出结果。能在不调试的情况下一次写出一个包含if-else分支的完整程序。我那天开始刷题之前先快速过了一遍这个清单发现有两个点我下意识会犹豫——字符串反转我习惯用切片但有时候会忘了考虑中文场景边界条件的判断我偶尔会写反。这就说明哪怕是Lv.1也值得认真刷一遍。3. 全天候刷题实战从字符串处理到边界模拟的真实记录3.1 高频题型一字符串处理最容易出细节问题Lv.1里字符串处理的题占比不小而且往往是最容易让人栽跟头的。举个例子有一道题是统计一句话里某个字母出现的次数。听起来简单吧但实际提交的时候很多人会挂掉原因在于题目要求不区分大小写但新手往往直接写if char target导致大写字母全部漏掉。我的标准解法思路如下s input().strip() target input().strip().lower() count sum(1 for ch in s.lower() if ch target) print(count)这里有几个关键点strip()去掉首尾空白防止把换行符算进去。别小看这一步很多Lv.1的坑就在这。统一转小写再比较避免大小写问题。用生成器表达式统计一行搞定代码简洁也少出错。还有一道题是反转字符串并输出。我见过至少有三种写法切片[::-1]、循环倒序拼接、先转列表再reverse()。从竞赛角度讲切片是最快的也是我推荐大家优先掌握的方式。但如果题目要求反转之后保留单词内部的顺序而交换单词位置比如hello world变成world hello那就不能只靠[::-1]了需要用split()再逆序拼接s input().strip() words s.split() print( .join(words[::-1]))这种题目就是典型的看起来简单但写法决定了你能不能快速AC。3.2 高频题型二数学计算重点练整除与取模Lv.1里有一类题目是纯数学计算比如求阶乘、判断闰年、计算最大公约数、判断素数。这里我重点说一下判断素数的题因为它在Lv.2里也会反复出现。最直观的做法是遍历从2到n-1的所有数看能不能整除。但对于稍微大一点的n这种写法效率就太低了。在Lv.1阶段我会让新手先写出最简单的版本然后再优化到遍历到sqrt(n)import math def is_prime(n): if n 2: return False if n 2: return True if n % 2 0: return False for i in range(3, int(math.sqrt(n)) 1, 2): if n % i 0: return False return True实际刷题的时候很多Lv.1的数学题数据范围不超过10的6次方你用O(n)的遍历虽然能过但浪费时间不值得。养成从小优化到位的习惯后面才不会在大数据范围面前手忙脚乱。再举一个细节例子求最大公约数。用辗转相除法是标准解法但我见过有些同学用循环从较小的数往下找数据范围小的时候也能过可一旦范围变大就会超时。推荐直接记住这个模板def gcd(a, b): while b: a, b b, a % b return a3.3 高频题型三模拟题边界条件决定生死Lv.1里有一类题目叫模拟题就是完全按照题目描述一步步执行不涉及高深算法但对边界条件的要求特别高。我那天印象很深的一道题是这样的给定一个正整数n如果它是偶数就除以2如果是奇数就乘以3加1重复这个操作直到变成1输出经过的步数。这是经典的考拉兹猜想模拟。看起来简单但有几个坑当n是1的时候步数是0不需要进入循环。有些新手没考虑这个直接得出错误的答案。当n比较大的时候中间过程可能会超出int的范围。在C里需要long long在Python里倒是不用担心但如果你用C写就得注意类型。循环次数并不一定很小极端情况下可能要很多步所以不能用递归要改成迭代。n int(input()) steps 0 while n ! 1: if n % 2 0: n // 2 else: n n * 3 1 steps 1 print(steps)这类模拟题练的是什么练的是仔细读题、把边界情况都考虑到的习惯。我见过有人把变成1的循环条件写成while n 1结果n本身就是1的时候步数变成0恰好对了但如果另一道题要求输出题目描述里至少经过一次操作后的结果这个写法就错了。所以在Lv.1阶段我的建议是不要只满足于题能过要想清楚为什么这么写边界情况是什么换一种表述你会不会做。3.4 高频题型四数组遍历与查找哈希表初体验数组类的题在Lv.1里占的份额很大从找最大值、求和、统计频次到去重都是热身级别的内容。有一个题我印象特别深输入一行整数输出出现次数最多的那个数如果有多个输出最小的那个。这个题在Lv.1的框架下最简单的解法是用列表或者字典统计from collections import Counter nums list(map(int, input().split())) counter Counter(nums) max_count max(counter.values()) result min(k for k, v in counter.items() if v max_count) print(result)这段代码有几个值得拆解的点Counter是Python内置集合模块里非常有用的工具竞赛里用来做频次统计比手写字典快得多。max(counter.values())先拿到最大频次然后用生成器表达式找出频次等于最大频次里的最小键值。如果你不用Counter手写字典也就多几行但思路要清楚先遍历统计再遍历找答案。数组遍历里还有一个容易犯的错——对空列表的处理。如果输入可能为空那么max()会直接报错。虽然Lv.1多数题目保证至少有一个数但养成检查的习惯总没错。4. 一次提交就过的小技巧从读题到自查的完整流程4.1 先手推样例再动笔写代码我发现很多人刷题的习惯是看到题就开始敲代码代码写完了才发现理解错了题意白费力气。我的习惯是先在草稿纸上手动模拟一遍样例。比如题目说输入两个数输出它们的和我就在纸上写下输入样例手动算出预期结果。如果手动算出来的结果和题目给的一样说明我读懂题了如果不一样那要停下来想想是不是我理解错了。这一步看起来多余但对Lv.1来说效率反而是最高的。因为Lv.1题目简单花30秒手推样例能省下10分钟的错误调试。4.2 边界值自查清单写完代码之后不要急着提交花30秒过一遍这几个自查项输入的最小值如果是数字取1或0试试如果是字符串取空串试试。输入的最大值如果是数组取长度很长的情况看看会不会超时。循环上下界while和for的边界是还是要不要1。除法和取模除数不能为0负数取模结果是否符合预期。字符串和数组索引是否可能越界len()的结果能否直接用作索引。我把这个清单打印出来贴在显示器旁边每次提交之前扫一眼。坚持了一个月之后我的第一次提交通过率从六成提到了九成。4.3 关于看题解的时机问题刷Lv.1的过程中一定会遇到做不出来的题。这时候该怎么办我的建议是给自己设定一个明确的卡壳时间比如15分钟。15分钟之内想不出来允许自己看题解但看完题解之后必须自己重写一遍不能只是抄一遍就提交。为什么因为看题解能让你开阔思路但只有合上题解自己写出来才说明你真的吸收了。我自己刷Lv.1的时候偶尔会遇到一些写法特别巧妙的题解我会专门把它们收集到一个文档里标注这个写法比我原来的快多少或者这个写法避开了哪个坑。等刷Lv.2的题时这些积累真的会派上用场。5. 那些年我们踩过的坑Lv.1高频失分点真实记录5.1 输入格式的隐形陷阱蓝桥云课的Lv.1题目里有一种典型的输入陷阱题目说第一行是n接下来的n行是数据。但有些题目并不明说接下来n行而是说输入包含若干行每行一个整数以0结尾。遇到这种输入格式如果你用for i in range(n): input()去读就会卡住。正确做法应该是循环读入直到遇到终止条件while True: try: line input() if not line: break num int(line.strip()) if num 0: break # 处理数据 except EOFError: break这里我用了一个try-except来捕获结束标志。不同平台对输入结束的处理方式不一样有的用EOF有的用特定值。养成读到底的习惯能避免很多因为输入格式写错导致的WA。5.2 多组测试数据时的输出格式另一个高频失分点是每组数据的输出之间要不要空行最后一行要不要换行多个输出要不要用空格隔开。有些题目的样例输出里每个结果占一行但如果你在最后多打了一个换行有些在线评测系统不会判错有些会。我的习惯是严格按照样例输出格式来不多不少。比如要输出YES或NO就不要画蛇添足地加句号、空格或换行以外的字符。这个听起来不值一提但我见过太多人挂在格式上了。5.3 语言选择的心理博弈Lv.1阶段的题用Python写是最快的因为语法简洁、不用考虑变量类型。但我要提醒一点如果目标是蓝桥杯正式比赛你要提前确认自己到底用哪个语言参赛。Python在入门阶段写起来舒服但到了正式比赛的时间复杂度要求比较高的题Python有时候会吃亏。C虽然写起来繁琐但运行效率高。所以我给新手的建议是如果只是刷着玩Python完全够用。如果确定用C比赛那从Lv.1开始就强迫自己用C提交不要用Python写了再翻译那样会多一道翻译的麻烦也容易出错。我当年就是因为Lv.1阶段太依赖Python的便利性后面转C的时候费了不少劲去适应指针和类型这些概念。这不是说Python不好而是要从第一天就想清楚最终参赛语言别走弯路。5.4 一个容易忽略的点代码的读取方式蓝桥云课的题目有时候会要求从文件读入有时候从标准输入读入。大部分入门题都是从标准输入读入所以我统一用input()处理不折腾文件IO。但有一种情况例外有些模拟题或数据处理量大的题如果数据真的很大用sys.stdin.read()一次读取全部数据会比逐行input()快很多。Lv.1阶段用不上这个优化但知道有这个方法以后遇到性能瓶颈时不至于抓瞎。import sys data sys.stdin.read().split()这个小技巧在Lv.2、Lv.3阶段会经常用到。早了解、早储备没坏处。6. 刷题节奏与心态管理一天50题比一天10题更有效吗6.1 我的一天时间分配方案day27当天我给自己定的计划是把Lv.1的绝大部分题目清完。实际执行下来大致的时间分配是这样的上午9点到11点集中刷字符串处理和数学计算类大概30道左右。下午2点到4点集中刷数组遍历和模拟题大概30道左右。下午4点到5点整理错题和标记跳过的题目大概20道左右。晚上8点到9点回头看当天标记的重点题目重新独立写一遍。总共算下来一天接触了大概80道Lv.1题其中真正独立写出并AC的大概70道左右。剩下的题目里有几道是重复度太高主动跳过有几道是平台数据有问题还有一两道是确实题目描述有歧义我选择不纠结。这里我要强调一个观点刷题数量不是目的覆盖度才是目的。同样是100道题如果你每天只刷1道但把每一道题背后的变体都想清楚了效果往往比一天刷100道但每道都是看一眼就写更好。6.2 如何判断自己会了这道题我给自己定了一个标准一道题做完之后如果让我三天后重新做一遍我能不看自己之前的代码就写出来并AC这才算真正掌握了。所以当天晚上我会做一件事把白天做过的一部分题从题库里随机调出来盲做一遍。做不出来的第二天再重点复习。这个方法听起来笨但非常有效。别相信我刚刚看了题解所以现在我懂了这种感觉那只是幻觉。6.3 进度落后了怎么办现实中经常发生这样的情况计划一天刷50道结果上午才刷了10道其中还有3道卡住了心态开始崩。我的经验是卡住是正常现象不用焦虑。Lv.1的题卡住多半不是因为你笨而是因为你对自己的水平预期太高了。刷题本身就是查漏补缺卡住说明发现了真实的问题这比顺畅地刷50道但什么都没学到更有价值。如果你真的在某一类题上反复卡壳我的建议是停下来回到基础语法层面做一次专项练习。比如字符串处理总是出错就专门刷10道字符串题直到熟练为止。不要急着推进度基础不牢后面十倍时间都补不回来。7. 常用代码模板与套路总结7.1 输入输出模板蓝桥云课的Lv.1题里输入输出有几种固定套路。我把最常用的模板整理在这里# 单个整数 n int(input().strip()) # 一行多个整数 a, b, c map(int, input().split()) # 多行数据第一行给数量 n int(input()) for _ in range(n): x int(input().strip()) # 未知数量的整数以EOF结束 import sys for line in sys.stdin: if line.strip() : continue num int(line.strip()) # 处理熟悉并默写这些模板能让你省下大量时间。不要小看这种肌肉记忆的作用真正比赛的时候时间就是分数。7.2 常用数据结构的一句话用法Lv.1阶段最常用的几个数据结构和它们的一句话用法列表推导式[x * 2 for x in nums]比手写循环更清晰。字典计数counts {}然后用counts[key] counts.get(key, 0) 1。集合去重unique set(nums)接着len(unique)就是不同元素的个数。排序nums.sort()默认升序nums.sort(reverseTrue)降序。字符串反转s[::-1]一行搞定。这些用法在Lv.1里会反复出现掌握它们就像练武的人先学会扎马步一样是基本功中的基本功。7.3 从Lv.1看向Lv.2那些可以提前铺垫的点虽然标题说的是Lv.1但作为过来人我必须提醒一句刷Lv.1不是终点是为Lv.2做准备的起点。在Lv.1阶段你可以顺手铺垫这几个点前缀和思想有些Lv.1数组求和题用前缀和写会更快。提前了解这个概念到Lv.2时会轻松很多。双指针判断回文、找相反数这类Lv.1的题用双指针是一种更优雅的解法。提前接触有助于建立更灵活的思维模式。贪心的直觉Lv.1的某些题比如找最小步数、最少硬币数用朴素的贪心思路能过但不一定每个贪心都对。培养为什么这个贪心成立的思考习惯Lv.2会受益。这些点不需要专门去学只需要在刷的时候多问自己一句除了这种普通写法还有没有更快的思路带着这个意识刷题进步会快很多。8. 给不同基础读者的具体建议8.1 如果是完全零基础先把语法过一遍再刷题零基础朋友看到Lv.1难度可能会觉得自己可以边刷边学。我不反对这种模式但有一个前提先花两天时间把基础语法快速过一遍至少要掌握变量、数据类型、条件语句、循环、列表、字符串这些最基本的东西。没有这个前提直接开刷你可能会在怎么读入多个整数怎么判断字符串相等怎么把字符转成数字这些点上反复卡壳效率极低。我的推荐路径是用任何一本Python教程或者视频课花两天时间过完基础语法。打开蓝桥云课从最简单的顺序结构题刷起。每做完一道题想一想这道题用了哪些语法点如果哪个语法点不熟立刻回去查。连续刷50道题之后你会发现基础语法已经不需要再刻意查了。零基础阶段最重要的是保持持续的小成功不要一上来就挑战Lv.3的难题那样容易打击信心。8.2 如果是有一定基础但没刷过题先做摸底测试如果你已经学过算法但没怎么刷过题我的建议是花一上午做一次摸底随机抽取Lv.1里20道题限时1小时做完。这20道题的结果能告诉你两件事基础语法是否足够熟练读题和代码落地是否顺畅如果20道题能在40分钟内全部AC那说明Lv.1对你来说太简单了可以跳过大量重复题只刷那些标记为扩展的题直接进入Lv.2。如果20道题花了50分钟以上或者有WA那说明你的基础还不够扎实建议老老实实把Lv.1当成一次能力体检认真刷完大部分题目。8.3 关于纯粹为了比赛和为了学好编程的区别最后说一个很多人没想清楚的问题刷题的目的到底是什么。如果是纯粹为了比赛拿奖那策略很简单刷真题、刷高频考点、练手速、练调试能力Lv.1只用来热身不需要花太多时间。这时候刷题的优先级是题目类型靠近真题的优先。如果目标是真正学好编程、建立算法思维那Lv.1恰恰是最不该跳过的基础训练。因为它不只是教你怎么写代码更是在培养你读题、构造边界用例、优化代码习惯这些受益终身的素养。不管是哪种目的我都建议至少把Lv.1里的字符串处理、数组遍历、边界模拟这三大类题认真过一遍不做完没关系但要做到看一眼就知道思路写出来基本能过的程度。9. 今日踩坑不完全记录最后分享几个我当天刷题时真实遇到的坑供大家参考。第一个坑是关于Python的input().split()在输入为空时的行为。有一道题要求处理多行输入但最后一行是空行。如果直接for line in sys.stdin最后一行可能是一个空字符串直接int()会报错。我的经验是读进来先strip()如果为空就直接跳过。第二个坑是关于排序稳定性的理解。有一道题要求按分数从高到低排序如果分数相同则按姓名字典序排序。这里如果不注意直接用元组排序且把分数取负值也能过但如果只按照分数排序而不处理同名次就没辙了。关键是理解sort()的稳定性以及元组排序的规则。第三个坑是取模运算在Python和C里的差异。Python中(-5) % 3的结果是1而C中-5 % 3的结果是-2。如果一道题涉及到负数取模不同语言的结果可能不同。所以在刷题之前一定要明确自己的参赛语言并且了解这门语言在取模、除法和类型转换上的细节。第四个坑是关于递归深度。虽然Lv.1很少会用到递归但有些模拟题如果用递归写很容易因为递归深度过大导致栈溢出。我的建议是能用循环的地方就用循环不要为了省事写递归。第五个坑是我个人最常犯的数组下标从0开始还是从1开始。题目描述里如果出现第i个元素有时候是从1开始数有时候是从0开始数。不同的题有不同的约定一定要先看清楚不要默认所有题都是从0开始。这些都是很小的细节但细节决定成败。Lv.1的意义就在于把这些细节一个个磨平让你在后面面对更复杂的题时不需要为这些基础问题分心。10. 一点个人体会刷完这批Lv.1的题我最大的感受不是这些题真简单而是**原来基础题里也有这么多可以琢磨的地方**。比如一个判断素数的题你可以用最简单的O(n)循环也可以优化到O(sqrt(n))一个字符串反转的题你可以用切片一行搞定也可以用双指针写得更通用。每一种写法背后都是一种思考习惯而思考习惯的养成恰恰是刷题真正带给我们的东西。如果你也在备赛或者想打基础我的建议是给自己定一个清空Lv.1的目标但不要追求数量的虚荣感要在每道题上都停留到真正理解了为止。速度当然重要但理解才是基石。最后分享一个小技巧刷题的时候准备一个文档把当天做错的题、卡住的题、觉得解法很巧妙的题都记录下来周末统一回看一遍。这个习惯我坚持了很长时间效果远超那些花里胡哨的刷题计划表。希望这个day27的打卡记录也能成为你刷题路上的一个小小参照。