数组去重的方式有多种,下面介绍两种
- 待操作数组用 数组a 表示
- 处理好的数组用 数组res 表示
- Hash 哈希去重
思路:
- 利用Map不能存储相同数值的原理
- 取得所有键值存入数组,即去重后的返回值
public static int[] delSame(int[] a){
Map<Integer,Integer> map = new HashMap<>();
for (int num:a) {
map.put(num,1);
}
Set<Integer> set = map.keySet();
int[] res=new int[map.size()];
Iterator<Integer> iterator = set.iterator();
int i=-1;
while (iterator.hasNext()){
res[++i]=iterator.next();
}
return res;
}
- 快慢指针去重
思路:
- 对数组进行排序
- 借助快慢指针 i 和 j ,让 i 始终指向不重复的数据的下标作为慢指针,让 j 一直遍历数组,寻找重复的数值
- 找到重复的数值就让 j++ 跳过
完整代码:
public static int[] delSame(int[] a){
//1.排序
Arrays.sort(a);
//2.去重
int n=a.length;
int[] res=new int[n]; //存放返回值,即去重后的数组
if(n==1){ //极端案例
res[0]=a[0];
return res;
}
int i=0; //慢指针
int j=0; //快指针
int temp=-1;
int num1 = a[i]; //指针i指向的值
int num2 = a[j]; //指针j指向的值
while (j<n) { //只要j不越界就一直执行,但由于循环体中有多个++j,所以循环体内也应该判断以防越界
res[++temp]=num1; //每循环一次num1更新一次且不是重复值
//防止越界
int t = j+1;
if(t==n){
break;
}
num2 = a[++j]; //更新 j
while(num2 == num1){//如果重复就让j++
if(j==n-1){ //防止越界
break;
}
num2=a[++j];
}
num1=a[j];
}
int size = temp+1; //发现去重后的数组大小 size=temp+1
int[] ans = new int[size];
for (int k = 0; k < size; k++) {
ans[k]=res[k];
}
return ans;
}
看似复杂,主要是判断越界的地方影响思维
核心代码:
while(j<n){
res(++temp)=num1;
num2=a[++j];
while(num1==num2){
num2=a[++j];
}
num1=num2;
}