区域交换
O(n)
O(1)
import java.util.Scanner; public class Main { public static Scanner sc = new Scanner(System.in); static void swap(int[] arr, int i, int j){ int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int n = sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = sc.nextInt(); } int u = 0; // A 区域, u代表最后一个位置 int i = 1; // B 区域,i代表开始的位置 while (i != n){ // i 向右移动 if(arr[i++] != arr[u]){ // i位置不等于u位置,那么u位置可以增加了 u ++; // u 加了1的位置, 跟i位置交换 swap(arr, u, i-1); } } for(int k=0;k<n-1;k++){ System.out.print(arr[k] + " "); } System.out.println(arr[n-1]); } } /* 16 1 2 2 2 3 3 4 5 6 6 7 7 8 8 8 9 1 2 3 4 5 6 7 8 9 6 2 7 2 8 8 3 */