题目:
假设有n个元素的一数组a,其中的数据已按由小到大的顺序存放,请编写函数去掉a数组中所有重复的数,只保留不同的数,其余清0,函数返回不同数的个数,函数原型为 int funel( int *a ,int n);
例如:数组a中的数据是2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,删除后数组a中前9个元素是2,3,4,5,6,7,8,9,10,其余为0,函数返回9
思想:取一个临时数组b,并令其全为0,判断数组a的值与flag是否相同,若不同则将数组a的值放入b,并使flag成为该值,若相同则跳过。
这样能得到一个由不重复数组成的数组b(0除外),如2,0,0,0,3,0,4,0,0,0,5,再对b进行冒泡排序,这样可以使得0在最前面,而其他数在最后面,
再重置a使其全为0,作循环,当判断到b数组的值不为0时,把b数组的值写入a,a指针地址向后偏移,不论是否写入,每次判断后都偏移b的指针,这样就使得a数组变成不重复的数在前面,并以0填充剩余的位置。
代码如下:
int funel(int *a,int n)
{
int i,j;
int *b;
int num;
int flag=0;
int temp;
b= (int *)malloc(n*sizeof(int));
for(i=0;i<=n;i++)
{
b[i]=0;
}
for(i=0;i<n;i++)
{
if(b[i]!=a[i]&&a[i]!=flag)
{
b[i]=a[i];
flag=b[i];
}
}
for(i=0;i<n;i++)//冒泡排序
{
for(j=0;j<n-i;j++)
{
if(b[j]>b[j+1])
{
temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
}
for(i=0;i<=n;i++)
{
a[i]=0;
}
j=0;
for(i=0;i<=n;i++)
{
if(b[i]!=0)
{
a[j]=b[i];
j++;
}
}
num=j;
return num;
}
int main()
{
int k;
int val;
int a[]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10};
val=funel(a,sizeof(a)/sizeof(int));
for(k=0;k<(sizeof(a)/sizeof(int));k++)
{
printf("a[%d]=%d\n",k,a[k]);
}
printf("val=%d\n",val);
return 0;
}