• 5097阅读
  • 4回复

删除数组中重复元素 [复制链接]

上一主题 下一主题
离线linxy
 

只看楼主 倒序阅读 楼主  发表于: 2012-06-03

闲着无聊,看到一个朋友问如何将一个数组中重复元素删除并只保留其中一个,于是写了下面的测试代码,没有排序,没有申请多余的空间,方法是将重复的元素放到数组的最后并缩短数组长度,因此,如果某个元素重复的次数比较多的话可以一次将数组缩短好多,下面贴上代码吧:
int _tmain(int argc, _TCHAR* argv[])
{
int l1, l2;
int i, j;
int x;
int t, k;
int a[] = {0, 0, 20, 10, 3, 3, 5, 2, 7, 3, 8, 9, 3, 7, 2, 5, 3, 3, 6, 9, 10, 7, 9, 20, 20, 0, 0, 0, 0};
int len = sizeof(a)/sizeof(a[0]);
l1 = l2 = len;
for(i=0; i<l1; ++i)
{
  k = a  [ i  ];
  l2 = l1;
  for(j=i+1; j<l2; ++j)
  {
   if(a[j] == k)
   {
    for(x = l2-1; x>j && a[x] == k; --x);
    l2 = x;
    if(l2 > j)
    {
     t = a[j];
     a[j] = a[l2];
     a[l2] = t;
    }
   }
  }
  l1 = l2;
}
for(i=0; i<l1; ++i)
{
  printf("%d ", a[  i   ]);
}
getchar();
return 0;
}

离线swqqyy
只看该作者 1楼 发表于: 2012-06-21
for(x = l2-1; x>j && a[x] == k; --x);
    l2 = x;
    if(l2 > j)
    {
     t = a[j];
     a[j] = a[l2];
     a[l2] = t;
    }
   }

对这部分代码觉得很难理解....为什么要和相同的元素进行交换呢?
离线yueno3

只看该作者 2楼 发表于: 2012-06-23
如果要删除重复元素的话,可以用remove算法,他会把所有一样的元素删干净

如果要重复元素只保留一个的话,可以用set容器,然后把元素往里面扔
离线wdhruien
只看该作者 3楼 发表于: 2012-06-25
用标准库和算法较为简单
离线linxy

只看该作者 4楼 发表于: 2013-02-18
回 1楼(swqqyy) 的帖子
把相同的元素放到数组的后面并保留一个在前面,这样可以缩小数组的长度,最终的结果是数组前面部分的元素都是不重复的,后面部分元素是跟前面有重复的,当然用标准库set最装简单了。写这个是为了练习,没有任何用处。
快速回复
限100 字节
 
上一个 下一个