我有以下数组
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}}
答案 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] << " ";
}