c++中数组长度为n的数组a[n]去掉其中重复元素,求算法

如题所述

采用matlab里面unique函数的算法,思路就是先排序,再求差分进行对比,以下是matlab unique函数的C++简化版,用到了标准库的一些东西:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template< typename T >
void Unique( T *ary, int len, vector< T > &va )
{
 // 第一步是升序排列
 int i = 0;
 for ( ; i < len; ++i )
  va.push_back( ary[ i ] );
 std::sort( va.begin(), va.end() );
 // 第二步:对排序后的序列求差分,差分为0的位置,说明值重复,需要删除
 // 第一个位置的元素始终保留
 for ( i = len - 1; i >= 1; --i )
  if( ( va[ i ] - va[ i -  1 ] ) == 0 )
   va.erase( va.begin() + i );
}
int main(int argc, char* argv[])
{
 int a[ 10 ] = { 3, 5, 3, 4, 6, 4, 1, 3, 1, 1 };
 vector< int > va;
 Unique( a, 10, va );
 cout << "原始序列:" << endl;
 for ( int i = 0; i < 10; ++i )
  cout << a[ i ] << " ";
 cout << endl;
 cout << "剔除重复数据后:" << endl;
 for ( int i = 0; i < va.size(); ++i )
  cout << va[ i ] << " ";
 cout << endl;
 return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-24
#include"iostream.h"

static int n=10;
int delnum(int a[]);
int main()
{
int i=0,a[n];
cout<<"请输入数组元素:"<<endl;
for(i=0;i<n;i++)
{
cin>>a[i];
}
delnum(a);
return 1;
}
int delnum(int a[])
{
int i=0,j=0,k=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
for(k=j;k<n;k++)
a[k]=a[k+1];
n--;
}
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 1;
}追问

我试了,不对啊,还是有重复的,我是设了a[10]={1,2,3,3,2,2,1,2,2,3};结果是1 2 3 2...

追答

int delnum(int a[])
{
int i=0,j=0,k=0;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(a[i]==a[j])
{
for(k=j;k<n;k++)
{
a[k]=a[k+1];
}
n--;
j--;
}

}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 1;
}
少了个j--,你试试

本回答被提问者采纳
第2个回答  2014-03-24

#include<iostream>

#define N 10
int zipdata(int *x,int n)
{ int i,j,nn,*p,same;
  for ( i=1,nn=1;i<n;i++ )
  { same=0;
    for ( j=0;j<nn;j++ ) if ( x[j]==x[i] ) { same =1; break; }
    if ( !same ) { x[nn]=x[i]; nn++; }
  }
  return nn;
}

void main()

{

    int x[N],n,i;
    cin>>n; if ( n>N ) n=N;
    for ( i=0;i<n;i++ ) cin>>x[i];
    for ( i=0;i<n;i++ ) cout<<x[i]<<' '; cout<<endl;
    n=zipdata(x,n);
    for ( i=0;i<n;i++ ) cout<<x[i]<<' '; cout<<endl;

}

相似回答