第七屆藍橋杯Java A——交換瓶子
有N個瓶子,編號 1 ~ N,放在架子上。
比如有5個瓶子:
2 1 3 5 4
要求每次拿起2個瓶子,交換它們的位置。
經過若干次後,使得瓶子的序號為:
1 2 3 4 5
對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。
如果瓶子更多呢?你可以通過程式設計來解決。
輸入格式為兩行:
第一行: 一個正整數N(N<10000), 表示瓶子的數目
第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。
輸出資料為一行一個正整數,表示至少交換多少次,才能完成排序。
例如,輸入:
5
3 1 2 5 4
程式應該輸出:
3
再例如,輸入:
5
5 4 3 2 1
程式應該輸出:
2
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗< 1000ms
簡單的選擇排序,對於下標為i(所有下標均從1開始)這個位置,本來應該是數字i放在這,如果不是,就去遍歷陣列找到i的位置j,然後交換arr[j]和arr[i]
import java.util.Scanner; public class Main { static int[] arr; public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); int ans = 0; arr = new int[n + 1]; for (int i = 1; i <= n; i++) arr[i] = cin.nextInt(); for (int i = 1; i <= n; i++) { if (arr[i] != i) { for (int j = i + 1; j <= n; j++) { if (arr[j] == i) { ans++; swap(i, j); break; } } } } System.out.println(ans); } static void swap(int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }