📋 U3 清單・知識點 K07

清單讀取與索引走訪

讀入一串資料,用位置取出資料、正著走或倒著走

B3-01-ListTraversal
練習平台
點標題可以展開或收合

1學習目標

  • 會用「重複 N 次」把一串資料一筆一筆讀進來。
  • 會把讀到的資料存進清單,之後用位置(第幾項)取出來。
  • 會用迴圈變數 i 同時表示「第幾筆」和「清單的第 i 項」。
  • 會倒著走清單,並處理位置在最前面、最後面的邊界情況。

2概念說明

清單就像一排有編號的置物櫃:第 1 格、第 2 格、第 3 格……每一格放一筆資料。只要知道「第幾格」,就能直接拿出裡面的東西。

8
3
12
7
10
清單的第 3 項是 12,位置從 1 開始算

題目的資料通常長這樣:第一行是 N(有幾筆資料),第二行是 N 個數字。讀入的方法都一樣:

詢問並等待 → N
重複 N 次:
    詢問並等待 → 數字
    (直接處理這個數字,或把它添加到清單最後)
你想做的事BlocklyScratch
準備一個空清單將 全部數字 設為「建立空的清單」刪除 全部數字 的所有項目
把資料放到清單最後自清單 全部數字 添加 最後一筆 為(數字)添加(數字)到 全部數字
取出第 P 項自清單 全部數字 取得 # P全部數字 的第 P 項
📌 一定要存進清單嗎?

如果每一筆資料讀到就能馬上處理(例如依序說出來),就不需要清單。只有當你需要之後再拿某一筆資料,例如「第 P 項是多少」「倒著說出來」,才需要先把資料存進清單。

3示範題:跟著一步一步做(2 題)

先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。

示範題 1

指定位置的數字

L1|基礎IDX01-001
給定 N 個整數與一個位置 P,請輸出第 P 個數字。位置從 1 開始計算。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入一個整數 P。保證 1 <= P <= N。
輸出
輸出一個整數,代表第 P 個數字。
範例1
輸入
5
8 3 12 7 10
3
輸出
12
第 1 步:讀題,找出輸入和輸出
  • 輸入:先輸入 N,接著 N 個整數,最後輸入位置 P。
  • 輸出:清單的第 P 個數字。
第 2 步:為什麼需要清單?

位置 P 是在最後才輸入的。讀數字的時候還不知道要哪一個,所以要先把 N 個數字全部存起來,等讀到 P 再去拿。

詢問並等待 → N
全部數字 設為 空清單
重複 N 次:
    詢問並等待 → 數字
    把 數字 添加到 全部數字 的最後
詢問並等待 → P
說出 全部數字 的第 P 項
第 3 步:用範例走一次

輸入 N = 5,數字「8 3 12 7 10」,P = 3:清單存好後是[8, 3, 12, 7, 10],第 3 項是 12。

第 4 步:對照範例答案

按「載入範例」,注意「建立空的清單」放在迴圈前面,「添加到清單」放在迴圈裡面。

⚠️ 常見錯誤
  • 在迴圈裡建立空清單:每一輪都被清空,最後清單裡只剩一個數字。
  • 把 P 當成第幾格的前一格:這個平台的清單位置從 1 開始,第 3 項就是第 3 個數字,不用減 1。
示範題 2

左右鄰居總和

L2|進階IDX01-007
給定 N 個整數與位置 P,請計算第 P 個數字左右鄰居的總和。若沒有左鄰居或右鄰居,該側視為 0。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入一個整數 P。保證 1 <= P <= N。
輸出
輸出一個整數,代表左右鄰居總和。
範例1
輸入
5
10 20 30 40 50
3
輸出
60
第 1 步:讀題,找出輸入和輸出
  • 輸入:N、N 個整數、位置 P。
  • 輸出:第 P 項的左鄰居(第 P−1 項)加上右鄰居(第 P+1 項)。沒有鄰居的那一邊當作 0。
第 2 步:想清楚邊界情況
P 的位置左鄰居右鄰居
在中間(1 < P < N)第 P−1 項第 P+1 項
在最前面(P = 1)沒有,當作 0第 P+1 項
在最後面(P = N)第 P−1 項沒有,當作 0

所以要先判斷「有沒有左鄰居(P > 1)」「有沒有右鄰居(P < N)」,再決定要不要去拿那一項:

(前面和上一題一樣,讀入並存好清單、讀入 P)
左邊 設為 0
如果 P > 1:左邊 設為 全部數字 的第 P−1 項
右邊 設為 0
如果 P < N:右邊 設為 全部數字 的第 P+1 項
說出 左邊 + 右邊
第 3 步:用範例走一次

清單[10, 20, 30, 40, 50]:

  • P = 3:左邊 20、右邊 40,輸出 60。
  • P = 1:沒有左鄰居,左邊 0、右邊 20,輸出 20。
  • P = 5:左邊 40、沒有右鄰居,輸出 40。
第 4 步:對照範例答案

按「載入範例」,範例答案用一個「測試…如果為真…如果為假…」積木,把「有鄰居就取值,沒有就用 0」寫在一行裡。和上面用兩個「如果」的寫法效果一樣。

⚠️ 常見錯誤
  • 沒有檢查邊界:P = 1 時去拿第 0 項,清單裡沒有這一格,結果會出錯或拿到空值。

4練習題(3 題)

照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。

清單逐一讀取

L1|基礎JSA01-D01
這題多了什麼:最基本的讀入方式:「重複 N 次」,每一輪讀一個數字就馬上說出來。這題不需要清單,先熟悉「一行有 N 個數字,就詢問並等待 N 次」的讀法。
看題目內容
第一行輸入一個整數 N,第二行輸入 N 個整數。請依照原本順序逐一輸出每個數字,每個數字各佔一行。本題用來示範清單逐一讀取與輸出。
輸入
第一行:一個整數 N。 第二行:N 個整數,以空白分隔。
輸出
依序輸出每個數字,每個數字各佔一行。
範例1
輸入
3
5 8 2
輸出
5
8
2
範例2
輸入
2
10 20
輸出
10
20
💡 需要提示嗎?
先把第二行的 N 個數字存進清單,再用迴圈從第 1 項取到第 N 項,逐一輸出。

冒險日誌

L2|進階count-018
這題多了什麼:不用存清單也能做:迴圈讓 i 從 1 數到 N,每一輪讀入一個數字,說出「Day-」、i、「-」、數字接起來的文字。這題練習的是:i 同時代表第幾天。
看題目內容
勇者寫了 N 天的冒險日誌,清單中依序記錄了每天打倒的怪物數量。 例如清單的第一個數字是第 1 天打倒的數量,第二個數字是第 2 天的... 請你格式化輸出每天的戰績,格式為:Day-[第幾天]-[數量]。 輸入格式 輸入共有兩行。第一行是一個整數 N,代表天數。 第二行輸入 N 個整數,代表每天怪物的數量。 程式依序輸出 N 天資料,每天格式為 Day-i-數量 不同天中間以空白間隔。
範例1
輸入
2
15 5
輸出
Day-1-15 Day-2-5
範例2
輸入
3
12 15 20
輸出
Day-1-12 Day-2-15 Day-3-20
💡 需要提示嗎?
迴圈變數 i 同時代表「第幾天」,而清單的第 i 項是「那天的數量」,兩個一起用。

倒轉時光

L2|進階count-017
這題多了什麼:要倒著說,就一定要先把資料存進清單。存好之後,讓迴圈的 i 從 N 倒數到 1,每一輪說出清單的第 i 項。
看題目內容
勇者獲得了一個「時光倒流」的魔法卷軸。這個卷軸上有一串數字密碼,但是必須從最後一個數字讀回到第一個數字,魔法才能生效。 請讀取一個清單,並將清單內的數字「由後往前」印出來。 輸入格式 輸入共有兩行。第一行是一個整數 N,代表密碼長度。 第二行輸入 N 個整數,代表N個數字的密碼組合。 程式反序輸 N 筆密碼數字資料,中間以空白間隔 (提示:循環計數迴圈起點設為清單長度,終點設為 1,間隔設為 -1)
範例1
輸入
4
10 20 30 40
輸出
40 30 20 10
範例2
輸入
3
1 2 3
輸出
3 2 1
💡 需要提示嗎?
讓迴圈從 N 倒數到 1,依序取清單的第 i 項,就會變成反向輸出。

5自我檢核

學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。

  • 我會用「重複 N 次」讀入一串資料,並把它們添加到清單最後。
  • 我會用位置取出清單的第幾項,並知道位置從 1 開始。
  • 我能說出什麼時候需要把資料存進清單,什麼時候邊讀邊處理就好。
  • 我會處理位置在最前面或最後面時的邊界情況。