如何对数组中重复的数只输出一次,并输出无重复的数组

camulos 2006-06-14 04:30:42
如何对数组中重复的数只输出一次,并输出无重复的数组
比如:数组a[10]={1,2,3,6,5,4,2,3,1,4} , 这个数组中有好几个数是重复的,我希望输出的结果是(1,2,3,6,5,4)或者(2,3,6,5,4,1)等等任何一种组合结果都可
以。请高手帮忙,谢谢。急急!!!
...全文
1500 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cunsh 2006-06-15
  • 打赏
  • 举报
回复

set hash_set
例如:
int main() {
int arr[] = {1,2,3,6,5,4,2,3,1,4};
set<int> si(arr, arr+10);
copy(si.begin(),si.end(),ostream_iterator<int>(cout , " ") );
}
tailzhou 2006-06-15
  • 打赏
  • 举报
回复
如果重复元素很多的话,我觉得用排序不如用二叉树。
tailzhou 2006-06-15
  • 打赏
  • 举报
回复
sharpdew(风刃) ( ) 信誉:100 2006-6-14 16:55:59 得分: 0



另外使用一个int[10]的数组,假设为b,初始化其中每个元素的值为0(或者最大整数,保证这个值不与原来数组中的数值相同),然后依次取原数组a中的元素,令index = a[i]%10,如果b[index]等于0,则把a[i]拷贝到b[i]处,否则是重复数,扔掉。最后,b数组中不为0的元素就是要求的序列。



你的算法的前提条件是:数组元素的范围为在1-9之间的;
只有数组元素的值在一个较小的范围内,才可以用类似的方法来做。



tom955 2006-06-14
  • 打赏
  • 举报
回复
累死我拉,搞定。

#include <stdio.h>
#include <windows.h>


void outPut(int array[])
{
int i,j,k;
i = 0;
printf("%d,",array[i]);
//获得数组的个数
while(IsBadReadPtr(array[i],sizeof(array)))
{
i++;
}
//printf("%d",i-1);

for(j = 1;j < i-1;j++)
{
for(k = j-1;k > 0;k--)
{
if(array[j] == array[k])
break;
}
if((0 == k)&&(array[0] !=array[j]))
printf("%d,",array[j]);
}
}



main()
{
int a[10]={1,2,3,6,5,4,2,3,1,4};

outPut(a);

return 0;

}
du51 2006-06-14
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define NONE 0 /*define by yourself*/
void ShowUnique(int arr[],int n)
{
int i,j;
if(!n)return;
for(i=0;i<n;i++)
{
if(arr[i]==NONE)continue;
for(j=i+1;j<n;j++)
{
if(arr[j]==NONE)continue;
if(arr[i]==arr[j])arr[j]=NONE;
}
}
i=0;
while(arr[i++]==NONE);
printf("(%d",arr[--i]);
for(++i;i<n;++i)
{
if(arr[i]!=NONE)printf(",%d",arr[i]);
}
printf(")\n");
}
int main()
{
int arr[]={1,2,3,6,5,4,2,3,1,4};
ShowUnique(arr,sizeof arr/sizeof arr[0]);
system("PAUSE");
return 0;
}
sharpdew 2006-06-14
  • 打赏
  • 举报
回复
那就用-1,当作unsigned的话就是最大整数。
yingge 2006-06-14
  • 打赏
  • 举报
回复
如果数组本身有0呢?
sharpdew 2006-06-14
  • 打赏
  • 举报
回复
int main()
{
int a[10]={1,2,3,6,5,4,2,3,1,4};
int b[10]={0};

for(int i=0; i<10; i++)
{
int index = a[i]%10;
if(!b[index])
b[index] = a[i];
}

for(int i=0; i<10; i++)
if(b[i])
cout << b[i] << endl;

return 0;
}
sharpdew 2006-06-14
  • 打赏
  • 举报
回复
int main()
{
int a[10]={1,2,3,6,5,4,2,3,1,4};
int b[10]={0};

for(int i=0; i<10; i++)
{
int index = a[i]%10;
if(!b[index])
b[index] = a[i];
}

for(int i=0; i<10; i++)
if(b[i])
cout << b[i] << endl;

return 0;
}
sharpdew 2006-06-14
  • 打赏
  • 举报
回复
另外使用一个int[10]的数组,假设为b,初始化其中每个元素的值为0(或者最大整数,保证这个值不与原来数组中的数值相同),然后依次取原数组a中的元素,令index = a[i]%10,如果b[index]等于0,则把a[i]拷贝到b[i]处,否则是重复数,扔掉。最后,b数组中不为0的元素就是要求的序列。
yingge 2006-06-14
  • 打赏
  • 举报
回复
为什么楼主觉得排序不好呢?
minioreo 2006-06-14
  • 打赏
  • 举报
回复
输出前先用一个循环判断当前要输出的数是否与前面的数有重复的 如果有重复则continue判断下一个数 否则输出该数;
SamuelKevin 2006-06-14
  • 打赏
  • 举报
回复
/////////////排序算法
#include <stdio.h>
#include <stdlib.h>

int cmp(const void*a,const void*b);

int main()
{
int i;
int n;
int *num;
printf("请输入数组个数:\n");
scanf("%d", &n);
num = (int *)malloc(sizeof(int)*n);
printf("请输入%d个数字:\n", n);
for (i=0; i<n; i++)
{
scanf("%d", &num[i]);
}
qsort(num,n,sizeof(int),cmp);
printf("输出:\n");
for (i=0; i<n; i++)
{
if (i==0||num[i]!=num[i-1])
{
printf("%d ",num[i]);
}
if (i%10==9)
{
putchar('\n');
}
}
return 0;
}

int cmp(const void*a, const void*b)
{
return *(int *)a-*(int *)b;
}
/////////////非排序算法
感觉开的数组太大了啊
我的想法是开个char flag[2^31-1]
memset(flag,'N',MAX);
然后对数字进行判断啊
camulos 2006-06-14
  • 打赏
  • 举报
回复
能否免去排序的步骤呢?有没有什么算法可以实现
yingge 2006-06-14
  • 打赏
  • 举报
回复
先用qsort排序
然后去掉重复的

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧