从 a+b 开始,重新捡起代码

📅 2026/8/24 15:43:45
从 a+b 开始,重新捡起代码
从今天开始我打算在 CSDN 上记录一下我的 Python 算法学习之路。我本身是物理学硕士研究方向跟计算机视觉、遥感图像、大模型这些东西沾边后面也想往 大模型设计方法 这个方向深入做研究。但我心里很清楚一件事大模型不是空中楼阁底层的代码能力、算法思维、数据结构功底一个都不能少。所以我决定先把 Python 和算法这块扎扎实实补一遍把地基打牢后面再往上盖楼才不会塌。再说说我的基础。Python 我不算完全零基础平时写点脚本、处理点数据、跑跑模型代码都没问题但说实话很多基础语法我都是 会用但说不清楚算法题更是很久没系统刷过了手感基本归零。所以这次我打算从零开始老老实实走一遍。关于学习方式我想好了不看视频直接刷题。视频这东西对我来说太容易 一看就会一写就废而且特别浪费时间。我的计划是第一阶段Python 基础巩固—— 用一系列最基础的题目来练手把输入输出、循环、条件判断、列表字典这些东西重新写熟第二阶段系统学习算法知识—— 基础题刷得差不多了就开始按专题来数组、链表、栈队列、哈希、树、图、动态规划…… 一个一个啃。每道题我都会记录题目描述、我的思路、最终代码、以及写的过程中踩了什么坑。不求快求扎实。第一题AB 问题题目描述你的任务是计算 ab。输入描述输入包含一系列的 a 和 b 对通过空格隔开。一对 a 和 b 占一行。输出描述对于输入的每对 a 和 b你需要依次输出 a、b 的和。如对于输入中的第二对 a 和 b在输出中它们的和应该也在第二行。输入示例3 4 11 40输出示例7 51我的思路这题看起来简单但有几个关键点输入不是只有一行而是持续不断地有行输入所以不能只读一次得用循环一直读input()读进来的是字符串比如3 4需要用split()按空格切开才能分别拿到两个数切出来的还是字符串得用int()转成整数才能相加。第一版代码有坑while 1: num1, num2 input().split() print(int(num1) int(num2))思路是对的while 1死循环一直读输入每读一行就切分、转换、输出。但是一提交就报错了EOFError。踩坑记录EOFError 是什么查了一下才明白当输入流结束的时候也就是没有更多输入了input()读不到东西就会抛出EOFErrorEnd Of File Error。在本地手动运行的时候你可以 CtrlC 终止但在线评测系统里输入是有固定结尾的读到最后一行再往下读就会触发这个错误。所以解决办法很简单用 try-except 捕获 EOFError捕获到就 break 退出循环。最终代码while 1: try: num1, num2 input().split() print(int(num1) int(num2)) except EOFError: break今天学到的三个知识点持续读多行输入要用while循环不能只读一次input()input()返回的是字符串多个值用.split()分割后可以直接解包赋值给多个变量但它们仍然是字符串需要int()转换在线评测中读到输入末尾会触发EOFError必须用try-except EOFError: break来退出否则会报错。第二题AB问题II题目描述计算 ab但输入方式有所改变。输入描述第一行是一个整数 N表示后面会有 N 行 a 和 b通过空格隔开。输出描述对于输入的每对 a 和 b你需要在相应的行输出 a、b 的和。如第二对 a 和 b对应的和也输出在第二行。输入示例2 2 4 9 21输出示例6 30提示信息注意测试数据不仅仅一组。也就是说会持续输入 N 以及后面的 a 和 b。我的思路这题跟上一题的区别在于每一组数据的第一行会先告诉你后面有多少行也就是这个 N。所以不能像上一题那样无脑一直读了得先读一个 N然后用一个for循环读 N 行每行做一次 ab。但提示里说了测试数据不止一组也就是说会反复出现 N N 行数据 这样的组合所以外层还得套一个while循环持续接收跟上一题一样要处理 EOF 的问题。整体结构就是外层while持续接收多组数据每组先读 N内层for循环 N 次每次读一行 ab 并输出。代码while 1: try: n int(input()) for i in range(n): a, b input().split() print(int(a) int(b)) except: break关键点梳理先读 N再循环 N 次n int(input())拿到这一组有多少行然后for i in range(n)控制读取次数外层 while 处理多组数据因为测试数据不止一组所以读完一组后不能停继续等下一组的 Nexcept 兜底跟上一题一样所有输入读完后input()会抛异常这里直接except: break统一捕获退出。对比第一题表格第一题第二题输入方式直接每行一对 ab先给 N再给 N 行 ab循环结构单层 whilewhile 套 for组数持续输入直到 EOF多组每组以 N 开头其实核心套路没变就是多了一层 先读数量再按数量读 的逻辑。这种 先给 N 再给 N 条数据 的输入格式在算法题里非常常见后面会反复遇到先把这个模板记熟。第三题AB 问题 III题目描述你的任务依然是计算 ab。输入描述输入中每行是一对 a 和 b。其中会有一对是 0 和 0 标志着输入结束且这一对不要计算。输出描述对于输入的每对 a 和 b你需要在相应的行输出 a、b 的和。如第二对 a 和 b他们的和也输出在第二行。输入示例2 4 11 19 0 0输出示例6 30我的思路这题的结束标志变了不是读到文件末尾结束而是遇到0 0就结束而且这一对不参与计算。所以思路是while 循环持续读每读一行先判断是不是0 0是就 break不是就输出和。踩坑记录为什么0 0不退出我一开始写的代码是这样的while 1: try: num1, num2 input().split() if int(num1) and int(num2) 0: break print(int(num1) int(num2)) except EOFError: break结果输入0 0的时候根本不退出继续往下跑。问题出在这一行if int(num1) and int(num2) 0:这是一个经典的优先级坑。Python 会把它解析成if (int(num1)) and (int(num2) 0):当num1 0时int(num1)的值是0而在 Python 里0是falsy假值and前面已经是假了整个表达式直接判定为假根本不会去判断num2是不是 0所以 break 永远执行不到。换句话说我想表达的是 num1 等于 0并且num2 等于 0但写出来的意思变成了num1 本身为真并且num2 等于 0完全不是一回事。正确写法两个变量都要显式地跟 0 比较while 1: try: num1, num2 input().split() if int(num1) 0 and int(num2) 0: break print(int(num1) int(num2)) except EOFError: break今天学到的知识点Python 中0是 falsy在条件判断里会被当作 False不能直接拿变量当布尔值用除非你明确知道自己在干什么a and b 0不等于a 0 and b 0比较运算符优先级高于and一定要分别写清楚遇到 特定输入结束 的题目先判断结束条件再处理数据顺序不能反。三道 AB 对比总结表格题号结束方式关键结构I读到 EOFwhiletry/except EOFErrorII多组数据每组先给 Nwhile套for range(n)III遇到0 0结束whileif a0 and b0: break