视觉计数重复,并将唯一条目放入数组 [C++] 中的新数组中

visual counting duplicates and put the unique entries in to new array in array [c++]

本文关键字:数组 C++ 新数组 一条 唯一 视觉      更新时间:2023-10-16

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

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

    0 1 2 3 4 5 6 7 8 958 |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++;
  1. 将整个数组复制到 std::set 中。 该集将消除重复项,这意味着重复项的插入将失败。

  2. 将集合复制回阵列。

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

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

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];
      }
   }
  }
}

函数完成后,您的计数将大于应有的计数,因为每个元素都会多次递增计数。你应该尝试这样的事情:

    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 是它出现的位置,因此它知道要消除哪个元素。我假设您需要在数组中保留元素的首次出现,否则您可以更轻松地消除它。希望对您有所帮助。

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