08|陣列反轉與統計
還沒完成C 或 C++ 皆可CPU 時間上限 1 秒
C 或 C++ 皆可|CPU 時間上限 1 秒
讀入 n 個整數,先把它們倒過來輸出,再輸出這些數字的最小值、最大值和總和。
因為要倒過來輸出,必須先把所有數字存起來,這就是陣列的用途。
第一行是一個整數 n(1 ≤ n ≤ 1000)。
第二行有 n 個整數 x,相鄰兩個數字之間用一個空白隔開(-1,000,000 ≤ x ≤ 1,000,000)。
輸出兩行:
- 第一行:把 n 個數字從最後一個到第一個依序輸出,相鄰兩個數字之間用一個空白隔開
- 第二行:三個整數,依序是最小值、最大值、總和,用一個空白隔開
輸入:
53 -1 4 1 5輸出:
5 1 4 -1 3-1 5 12輸入:
3-8 -2 -5輸出:
-5 -2 -8-8 -2 -15- 陣列宣告:
int a[1000];,合法的索引是a[0]到a[999],a[1000]已經超出範圍 - 用迴圈讀入:
for (int i = 0; i < n; i++) - 倒過來走:
for (int i = n - 1; i >= 0; i--) - 找最小值、最大值時,初始值要用第一個元素,不要用 0
- 總和的範圍:最多 1000 × 1,000,000 = 10^9,
int剛好放得下(上限約 21 億) - C:陣列大小要是常數,所以直接開題目的最大值 1000
- C++:可以用
std::vector<int> a(n);,大小在執行時才決定
提示 1:全部都是負數時,最大值為什麼變成 0?
如果寫 int max = 0;,再一個一個比較,當所有數字都是負數時,沒有任何數字比 0 大,max 就一直是 0,但 0 根本不在輸入裡。同樣的,全部都是正數時,min = 0 也會出錯。
正確做法:min 和 max 的初始值都設成 a[0],再從第二個元素開始比較。
提示 2:數字之間的空白怎麼處理?
「相鄰兩個數字之間一個空白」代表 n 個數字之間只有 n - 1 個空白。常見的兩種寫法:
- 先印第一個數字,之後每個數字都印成「空白 + 數字」
- 每個數字前面都印空白,除了第一個(用
if判斷是不是第一個)
(這個沙盒比對時會忽略行尾的空白,但練習寫出剛剛好的格式是好習慣,其他評測系統不一定會忽略。)
提示 3:陣列越界
倒過來輸出時,最後一個元素是 a[n - 1],不是 a[n]。如果迴圈從 i = n 開始,a[n] 根本不是輸入的資料,會印出奇怪的值;當 n 剛好是 1000 時,a[1000] 更是超出了陣列的範圍。
C/C++ 不會自動檢查索引,越界通常不會馬上當掉,而是默默讀到奇怪的值。超出範圍的存取,檢查時第一階段的 Sanitizer 會幫你抓出來。