数组 - 消除所有重复的C ++

时间:2014-11-02 16:19:38

标签: c++ algorithm duplicates

我有以下数组

a[0]=4, a[1]=6, a[2]=9, a[3]=4, a[4]=4 ...

我想从数组中删除所有重复值并打印数组。 因此,数组4 6 9 4 4将变为4 6 9

我写了这样的代码:

for(int i=0;i<=n-1;i++)
    {
        if(frec[a[i]]>1) //see if there are duplicate values in frequency array.
        {
            for(int j=i;j<=n-1;j++)
                a[i]=a[i+1];
            frec[a[i]]--;
            n=n-1;
        }
    }

然而,4 6 9取代6 6 9而不是#include <iostream> #include <limits.h> using namespace std; void readarray(int a[], int frec[],const int &n) { for(int i=0;i<=n-1;i++) { cout<<"a["<<i<<"]="; cin>>a[i]; frec[a[i]] += 1; } } void printarray(int a[], int frec[], const int &n) { for(int i=0;i<=n-1;i++) cout<<a[i]<<" "; cout<<endl; for(int i=0;i<UCHAR_MAX;i++) cout<<frec[i]<<" "; cout<<endl; } void eliminareduplicate(int a[],int frec[], int &n) { for(int i=0;i<=n-1;i++) { if(frec[a[i]]>1) { for(int j=i;j<=n-1;j++) a[i]=a[i+1]; frec[a[i]]--; n=n-1; } } } int main() { int a[100], frec[UCHAR_MAX]={0}, n; cout<<"n= "; cin>>n; readarray(a,frec,n); eliminareduplicate(a,frec,n); printarray(a,frec,n); } 。谢谢。

编辑:完整代码

{{1}}

3 个答案:

答案 0 :(得分:0)

原因是拼写错误:

   if(frec[a[i]]>1)
    {
        for(int j=i;j<=n-1;j++)
            a[i]=a[i+1];     // <===== USE j not i !  
     ....

然而,结果将是第一个重复项将被删除,并且仅保留最后一个重复项(因为如果它们的频率大于1则删除项目,这在以前出现的所有事件都不再是去除)。

如果您希望保留第一次出现,但删除剩余的出现,这里是原始算法的变体:

for (int i = 0; i <= n - 1; i++)
{
    if (frec[a[i]] > 1) //if there are duplicate values in frequency array.
    {
        int m = 0;      // number of items removed 
        for (int j = i + 1, k = i + 1; j <= n - 1; j++) // start looping from next
            if (a[j] != a[i])    // if it's not one of the duplicate,
                a[k++] = a[j];   // copy it
            else m++;            // otherwhise don't copy it, and icrease items not copied. 
        frec[a[i]] -= m; 
        n -= m;
    }
}

我不知道这是否与您相关,但是对于每个副本,您的版本会在第n次出现后移动所有元素n-1次,而此变体仅移动它们一次。

您还会注意到,此变体可以在不使用频率表的情况下正常工作(除非它会系统地循环其余项目,而不是仅针对重复项目)。

答案 1 :(得分:0)

有一点可以肯定的是,这是一个可以设计用于检测/删除数组中重复项的最差程序。这是因为你的frec数组的大小取决于数组中的数字。

所以,更好的选择是去std :: set

OR

如果您不想在元素之间进行排序,那么您可以为此选择哈希表实现。

答案 2 :(得分:0)

您可以尝试以下代码。我不需要使用frec数组。如果数组中有重复元素,我将忽略它并减小原始数组的大小。

for (i = 0; i < size; i++) {
      for (j = i + 1; j < size;) {
         if (a[j] == a[i]) {
            for (k = j; k < size; k++) {
               a[k] = a[k + 1];
            }
            size--;
         } else
            j++;
      }
}

要打印数组:

 for (i = 0; i < size; i++) {
      std::cout << a[i] << " ";
 }