计算重复项并将唯一条目放入数组中的新数组[c ++]

时间:2012-04-13 11:26:05

标签: c++ visual-c++

q。编写一个包含名为“remove_duplicates”的函数的程序,该函数以随机顺序获取整数数组,然后消除数组中的所有重复整数。该函数应该有三个参数:

  1. 一个整数数组(读取并填写为主要内容)
  2. 数组的大小。
  3. 通过引用传递的变量在main中打印,以显示数组中有多少个值   没有重复。 该函数不应返回值,但如果消除了任何重复的整数,则该函数应计算该值,因此新值表示数组中不同整数的数量。假设传递给函数的数组如下所示,传递给函数的数组大小为10.

    0 1 2 3 4 5 6 7 8 9 58 | 26 | 91 | 26 | 70 | 70 | 91 | 58 | 58 | 66

  4. 该函数应该将数组更改为:

    0       1       2     3       4      5      6      7     8      9    
    58 | 26 | 91 | 70 | 66 | ?? | ?? | ?? | ?? | ??
    

    并且应该更改不同计数器的值,使其为5.第5个单元格后面的单元格中的问号表示当函数返回时,这些单元格中的数字无关紧要。

    我的功能有问题

    void remove_duplicates ( int h[] ,int n ,int &count ){
    count = 0;
    int a[100];
    for (int i = 0 ; i < n  ; i++ )
            for(int j = i ; j<n ; j++){
                if(h[i]!=h[j])
                            a[i]=h[i];
                else
                count++;
    

4 个答案:

答案 0 :(得分:1)

  1. 将整个数组复制到std :: set中。该集将消除重复,这意味着重复项的插入将失败。

  2. 将集合复制回数组。

  3. 唯一值的数量是集合的大小。

答案 1 :(得分:0)

这些问题有很多解决方案我将向您展示一个没有临时数组的解决方案。 如果您的要求允许您使用排序算法,则在应用此代码之前对数组进行排序:

unsigned int numberOfDuplicates = 0;
for( unsigned int i = 1; i<numberOfElements; i++ )
{
  if( array[i-1] == array[i] ){
    numberOfDuplicates++;
    for( unsigned int j = i; j< numberOfElements-1; j++ )
    {
       array[j] = array[j+1];
    }
  }
}

每当你找到一个新的复制品时,你可以通过将阵列的其余部分移动一个位置来吃掉它。第二个解决方案是通过分配一个新数组并仅传递其中已存在的值,之后只需复制已分配的数组。

如果没有排序,算法可能是:

unsigned int numberOfDuplicates = 0;
for( unsigned int i = 1; i<numberOfElements; i++ )
{
 for( unsigned int k = i; k < numberOfElements; k++){
   if( array[i-1] == array[k] ){
      numberOfDuplicates++;
      for( unsigned int j = k; j< numberOfElements-1; j++ )
      {
       array[j] = array[j+1];
      }
   }
  }
}

答案 2 :(得分:0)

您的计数将大于功能完成时的计数,因为您为每个元素增加了多次。你应该尝试这样的事情:

    void remove_duplicates ( int h[] ,int n ,int &count ){
count = n;
int a[100],ok,p;
for (int i = 0 ; i < count-1  ; i++ ) {
    ok=1;
    for(int j = i+1 ; j<count ; j++)
        if(h[i]==h[j]) {
            ok=0;
            p=j;
        }
    if(!ok) {
        for(int j = p+1; j<count; j++) 
            h[j-1]=h[j];
        count--;
    }
}
count=n-count;
}

“ok”检查是否可以在数组中的其他位置找到v [i],p是它出现的位置,因此它知道要消除哪个元素。我假设你需要保持数组中元素的第一次出现,否则你可以更容易地消除它。希望它有所帮助。

答案 3 :(得分:0)

如果您有一个已定义的范围或可能的无效值(例如-1),则可以将重复项设置为此无效值,并在遍历数组时找到重复项,然后将元素移回到开头。