题目描述
给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序。
例如,arr = [1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, …]。
思路
参考:《程序员代码面试指南》
将数组划分为两个区域,左侧区域为排好序的区域,右侧区域为剩下的区域。使用两个指针:指针u指向左侧区域的最后一个位置,指针p做从左到右的遍历。指针u的初值为0,指针1的初值为1。
当arr[u]!=arr[p]时,说明p的元素应该移到u+1的位置,所以令u++,并交换u和p的元素,然后令p++,继续看下一个位置。否则,直接令p++,直接看后面的位置。
代码
import java.util.*;
public class Main{
public static void main(String []args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int []a = new int [n];
for(int i = 0 ; i<n ; i++){
a[i] = scanner.nextInt();
}
int u = 0;
int p = 1;
while(p<n){
if(a[p] != a[u]){
u++;
swap(a,u,p);
}
p++;
}
for(int i = 0 ; i<n ; i++){
System.out.print(a[i] + " ");
}
System.out.print("\n");
}
public static void swap(int []a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}