**
数组去重问题
**
数组去重问题,常常可能伴随着排序问题一起出现,下面分享几种数组去重问题的方法,每种方法在不同运用环境下,优势各为不同,处理问题时应灵活使用。
一、定义新数组法
定义一个新数组b[n],先将原数组根据要求排序,原数组为12 23 35 12 12 69,按升序排序后数组为12 12 12 23 35 69,再将排序后数组a[n]遍历,若不重复则将a[i]放入b[i]中,下面是代码实现。
int fun(int a[] int n)
{
for(int i=0;i<n-1;i++)//冒泡排序
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1]
{
int t;
t=a[j+1];
a[j+1]=a[j];
a[j]=t;
}
int b[N],index=0,sum=0;
for(int k=0;k<n;k++)//去重并统计实际个数
if(a[k]!=a[k+1])
{
b[index++]=a[k];
sum++
}
return (sum);
}
二、向前移位法
通过双重for循环,判断a[i]是否等于a[j],若相等,即该数组元素重复,再用循环将从这一位开始的所有数组向前移一位,即a[j]=a[j+1]
,比如 12 23 35 12 69,操作后数组元素为
12 23 35 69,但这样并不完全正确,若遇到这样的数组 12 23 35 12 12 69,如果通过上述操作后得到的数组元素应为 12 23 35 12 69,很显然该数组依然存在重复数组,所以为了确保移位后仍存在重复数组,在执行完上述操作后j的值应不变,下面是代码实现。
int fun (int a[], int n)
{
int sum=0;//去重开始
for(int j=0;j<n-1-sum;j++)
for(int k=j+1;k<n-sum;k++)
if(a[j]==a[k])
{
sum++;
for(int i=k;i<n;i++)
a[i]=a[i+1];
k--;//确保向前移位后不存在重复数组元素
}//去重结束
for(int i=0;i<n-1-sum;i++)//冒泡排序
for(int j=0;j<n-i-1-sum;j++)
if(a[j]>a[j+1])
{
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
return(n-sum);
}
三、重复数组元素特殊化
先通过循环将数组中重复的元素特殊化,比如
12 23 35 12 12 69,若数组元素不存在0,那么我们可以将重复的元素赋值为0,处理后的数组为 12 23 35 0 0 69,处理后根据题目要求再行设计,若题目只要求统计重复元素的个数,那么我们只需统计数组中0的个数即可,
一般题目可能会涉及到排序问题,那么我们根据题目要求合理将重复元素特殊化,比如上述元素去重后若以升序输出,那么将重复元素赋值为0较为方便,排序后数组为 0 0 12 23 35 69,这时再通过循环当扫描到第一个不为0的元素时,再用第二种方法将数组向前移0的个数位,操作后数组为 12 23 35 69,下面是代码实现。
int fun (int a[], int n)
{
for(int j=0;j<n-1;j++)//去重开始
for(int k=j+1;k<n;k++)
if(a[j]==a[k]&&a[j]!=0)
a[k]=0;
for(int i=0;i<n-1;i++)//冒泡升序
for(int j=0;j<n-i-1;j++)
if(a[j]>a[j+1])
{
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
int T=0;
for(int k=0;k<n;k++)//扫描到第一个不为零时向前移位
if(a[k]!=0&&a[k-1]==0)
{
T=k;
break;
}
for(int i=0;i<n-T;i++)
a[i]=a[T+i];//去重结束
return(n-T);
}