0

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

  1. 一个整数数组,它是(读取并填充在 main 中)
  2. 数组的大小。
  3. 通过引用传递的变量将在 main 中打印,以显示数组中有多少值没有重复。该函数不应返回值,但如果消除了任何重复的整数,则该函数应对其进行计数,因此新值会告诉数组中不同整数的数量。假设传递给函数的数组如下图,传递给函数的数组大小为10。

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

该函数应将数组更改为如下所示:

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

4 回答 4

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

  2. 将集合复制回数组。

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

于 2012-04-13T12:30:59.623 回答
0

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

于 2012-04-13T12:45:55.963 回答
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 是它出现的位置,因此它知道要消除哪个元素。我假设您需要保留数组中元素的首次出现,否则您可以更轻松地消除它。希望能帮助到你。

于 2012-04-13T12:31:24.647 回答
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];
      }
   }
  }
}
于 2012-04-13T11:52:49.673 回答