
從今天開始我打算在 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