问题描述 :存在一个升序数组,将数组中的重复数据去除,且原有的顺序不变。
问题分析:
1.已知数组升序,那么存在的重复数据一定物理相邻。
2.数组去重即将所有非重复元素前置。
3.可设置两个指针,快指针用来查询数据,慢指针用来数据对照。
具体实现:
#include <stdio.h>
int removeDuplicates(int* arr,int length);
int main(){
int arr[6] = {1,1,2,2,2,3};
int length = sizeof(arr)/sizeof(arr[0]);
int i;
int newLength = removeDuplicates(arr,length);
printf("%d\n",newLength);
for(i = 0; i < newLength; i++){
printf("%d ",arr[i]);
}
return 0;
}
int removeDuplicates(int arr[],int length){
if(!arr || length < 1) return 0; //数组不存在或者空数组
int p = 0, q = 1;//双指针,p q
while(q < length){
//当 q>length时说明后面全都是重复项了,无需再去除
if(arr[q] != arr[p]){
if(q - p > 1){
//找到不重复项
arr[p+1] = arr[q];
}
//p++,开始排除下一个元素的重复项
p++;
}
q++;
}
return p+1; //返回p之前元素个数
}
代码说明:快指针q用来搜寻与慢指针p所指示的数据不同的数据,当搜寻到时,就将其放至p之后,实现非重复数据的迁移;慢指针p用来指示当前需要去重的数据。
细节说明:
1.当数组不存在或者数组为空的极端情况需要考虑。
2. 数组不存在重复元素时需要通过 q - p > 1 条件来进行优化。