📋 U3 清單・知識點 K10

位置追蹤與線性搜尋

記住資料的位置,找出目標第一次或最後一次出現在哪裡

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

1學習目標

  • 會在找最大值、最小值時,同時記住它在第幾個位置。
  • 會用線性搜尋:從頭到尾一個一個找,找出目標出現的位置。
  • 會分辨「最後一次出現」和「第一次出現」的寫法差別。
  • 會處理「找不到」的情況。

2概念說明

到目前為止,我們關心的是資料的「值」:最大的是多少、總和是多少。這個知識點開始關心資料的「位置」:它排在第幾個?

找位置的方法叫做線性搜尋:從第 1 個開始,一個一個檢查,符合就把目前的位置 i 記下來。

位置 設為 0                  ← 0 代表「還沒找到」
i 從 1 數到 N:
    如果 第 i 項 符合條件:
        位置 設為 i
說出 位置

位置的初始值設為 0 很方便:清單的位置從 1 開始,所以走完之後如果位置還是 0,就代表一次都沒找到,剛好就是很多題目要求的輸出。

💡 最後一次和第一次,只差一個條件

上面的寫法每次符合都會覆蓋位置,所以留下來的是最後一次出現的位置。如果要第一次出現的位置,只要多加一個條件:「位置還是 0(還沒找到過)」才更新,找到之後就不會再被覆蓋。

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

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

示範題 1

最後一個目標位置

L2|進階IDX01-003
給定 N 個整數與目標值 X,請找出 X 最後一次出現的位置。位置從 1 開始計算。若沒有出現,輸出 0。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入一個整數 X。
輸出
輸出一個整數,代表 X 最後一次出現的位置;若不存在則輸出 0。
範例1
輸入
6
4 8 3 8 5 8
8
輸出
6
第 1 步:讀題,找出輸入和輸出
  • 輸入:N、N 個整數,最後是目標值 X。
  • 輸出:X 最後一次出現的位置;沒出現就輸出 0。
第 2 步:把問題拆成步驟

目標值在最後才輸入,所以要先把資料存進清單:

(讀入 N 個數字,存進 全部數字)
詢問並等待 → 目標值
位置 設為 0
i 從 1 數到 N:
    如果 全部數字 的第 i 項 = 目標值:
        位置 設為 i
說出 位置
第 3 步:用範例走一次

清單[4, 8, 3, 8, 5, 8],目標值 8:

i第 i 項等於 8?位置
開始前--0
14否0
28是2
33否2
48是4
55否4
68是6

輸出 6。如果目標值是 7,位置從頭到尾都是 0,輸出 0。

第 4 步:對照範例答案

按「載入範例」,看看「位置 設為 i」放在「如果」裡面,每次找到都會把位置更新成目前的 i。

示範題 2

第一個目標位置

L2|進階IDX01-002
給定 N 個整數與目標值 X,請找出 X 第一次出現的位置。位置從 1 開始計算。若沒有出現,輸出 0。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入一個整數 X。
輸出
輸出一個整數,代表 X 第一次出現的位置;若不存在則輸出 0。
範例1
輸入
6
4 8 3 8 5 8
8
輸出
2
第 1 步:和上一題差在哪裡?

同樣的資料,這次要找第一次出現的位置。只要在條件上多加「位置 = 0」,用「且」接起來:

如果 位置 = 0 且 全部數字 的第 i 項 = 目標值:
    位置 設為 i
第 2 步:用範例走一次

清單[4, 8, 3, 8, 5, 8],目標值 8:i = 2 時第一次找到,位置變成 2。之後 i = 4、6 雖然也是 8,但位置已經不是 0,條件不成立,位置就停在 2。

第 3 步:對照範例答案

按「載入範例」,看看「且」積木左右兩邊各放了一個條件。

⚠️ 常見錯誤
  • 忘了加「位置 = 0」:答案會變成最後一次的位置 6,而不是第一次的 2。
  • 位置的初始值設成 1:找不到時會輸出 1,而且「位置 = 0」這個條件永遠不成立。

4練習題(2 題)

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

清單最大最小值的位置

L2|進階seclect-003
這題多了什麼:把 K09 的擂台法和「記住位置」合在一起:更新最小值的時候,同時把位置更新成 i。所以這裡的迴圈要用計數迴圈,才有 i 可以用。題目說最小值出現多次時要最前面那一個,所以比較時用「<」(相等時不更新)。
看題目內容
在進行排序之前,程式必須先知道「最大值或最小值在清單的哪一個位置」。 小安已經可以找出清單中的最大值與最小值, 但老師希望他進一步找出該數值所在的位置(索引值), 才能正確進行資料交換。 現在給你一個固定長度為 5 的整數清單, 請找出清單中最小值所在的位置。 注意事項: 1. 清單位置由 1 開始計算(第 1 個為位置 1)。 2. 若最小值出現多次,請輸出最前面出現的那一個位置
輸入
第 1 行:輸入一個數N,N固定為整數5 第 2 行:輸入5 個整數,代表清單內容(以空格隔開)。
輸出
輸出一個整數,代表最小值所在的位置(索引值)。
範例1
輸入
5
8 3 5 1 6
輸出
4
範例2
輸入
5
2 4 2 9 5
輸出
1
💡 需要提示嗎?
找最小值時,除了記住「最小值是多少」,也要同時記住「它在第幾個位置」。

第一個及格的位置

L2|進階CNT01-022
這題多了什麼:和示範的「第一次出現」寫法相同,只是把「等於目標值」換成「分數 ≥ 60」。這說明線性搜尋可以找任何條件,不只是找某個固定的數字。
看題目內容
給定 N 位學生的成績,請找出第一個分數大於或等於 60 的位置。位置從 1 開始計算。保證至少有一位學生及格。
輸入
第一個整數為 N,接著輸入 N 個整數代表成績。
輸出
輸出一個整數,代表第一個及格成績的位置。
範例1
輸入
5
40 55 60 80 30
輸出
3
💡 需要提示嗎?
和上一題的寫法相同,只是把「等於目標值」換成「分數 ≥ 60」。

5延伸挑戰(1 題)

核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。

🚀 兩個目標的距離 L3|挑戰
挑戰重點:在同一個迴圈裡同時找兩個目標:用兩個位置變數(位置 A、位置 B),各自用「還沒找到才更新」的寫法。最後距離要用大的減小的。
給定 N 個整數,以及兩個目標值 A 與 B。請找出 A 第一次出現的位置與 B 第一次出現的位置,並輸出兩個位置的距離。保證 A 與 B 都會出現。
輸入
第一個整數為 N,接著輸入 N 個整數,最後輸入兩個整數 A 與 B。
輸出
輸出一個整數,代表兩個位置的距離。距離一律用較大的位置減較小的位置。
範例1
輸入
6
4 8 3 9 5 8
8 9
輸出
2
💡 需要提示嗎?
分別找出 A 和 B 第一次出現的位置,再算兩個位置相差多少(用大的減小的)。

6自我檢核

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

  • 我會在更新最大值或最小值時,一起記住它的位置。
  • 我會用線性搜尋,找出符合條件的資料在第幾個位置。
  • 我能說出「最後一次」和「第一次」出現的寫法差在哪裡。
  • 我知道位置初始值設為 0 的好處。