Defective Sawtooth Sequence Restoration
題目說明
鋸齒狀數列是一種具有特定規律的數列。該數列由多個子數列串接而成,必須滿足以下所有條件:
- 數列由嚴格遞增子數列與嚴格遞減子數列交錯排列組成(例如:遞增 -> 遞減 -> 遞增...,或是 遞減 -> 遞增 -> 遞減...)。
- 所有「嚴格遞增子數列」的內容必須完全相同。
- 所有「嚴格遞減子數列」的內容必須完全相同。
- 嚴格遞增子數列必須恰好是嚴格遞減子數列的「逆序」結果。
- 每個子數列的長度至少為 2。
- 子數列之間是直接串接,不共用元素。因此,若子數列長度為 k,則在遞增與遞減交界處會出現重複的數值(例如山頂有兩個最大值,山谷有兩個最小值)。
範例: 1 2 3 3 2 1 1 2 3 是一個合法的鋸齒狀數列。
- 子數列 A:1 2 3 (遞增)
- 子數列 B:3 2 1 (遞減,且為 A 的逆序)
- 排列方式:A -> B -> A
現在給定一個整數 n 以及一個長度為 n 的整數數列。已知這個數列中混入了一個錯誤的數值,只要移除恰好一個元素,剩下的 n-1 個元素就能組成一個合法的鋸齒狀數列。 請撰寫程式找出那個被移除後能讓數列變為合法的數值。
提示: 此題存在一個十分簡單但可能不是非常直覺的解法,不含註解與空白行的程式碼僅約30行。
輸入值的格式
輸入分為兩部分: 第一行包含一個整數 n (3 <= n <= 100),表示原始數列的長度。 第二行包含 n 個整數,以空白分隔,代表數列中的元素。每個元素的數值範圍為 [1, 100]。
輸出值的格式
輸出一個整數,代表被移除的那個數值。 題目保證必定存在唯一的解。
各種需要注意的邊界條件
- 子數列長度:合法的子數列長度最小為 2(例如 1 2 2 1)。
- 起始方向:合法的鋸齒狀數列可能由「遞增」開始,也可能由「遞減」開始。
- 錯誤位置:需要被移除的元素可能位於數列的開頭、結尾、兩個子數列的交界處,或是子數列的內部。
- 區塊數量:修復後的數列可能只包含 2 個子數列(一升一降),也可能包含多個。
sample input1
7
4 5 6 6 6 5 4sample output1
6解釋:移除索引 3 的數值 6 後,數列變為 4 5 6 6 5 4。 這由 4 5 6 (增) 和 6 5 4 (減) 組成,符合定義。
sample input2
10
3 2 1 1 2 3 3 2 1 1sample output2
1解釋:移除倒數第二個 1 或最後一個 1 之後,數列變為 3 2 1 1 2 3 3 2 1。符合 1 2 3 與 3 2 1 的交錯。注意,這個仍然是唯一解,因為題目只要求輸出被移掉的數值,不在乎該數值的位置。
Comments