标签:
//问题:
//给你一个数组,a[]={1,1,1,1,1,2,2,2,2,3,3,3,4,5,6}
//要输出的结果是1,2,3,4,5,6.(去除重复的数字,要求时间空间的考虑).
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
Node():data(-1),next(NULL){}
};
//时间复杂度大幅度减少,但是增加了一定的空间复杂度。
class Hash
{
public:
Hash(int a[],int n)
{
NodeTable = new Node[7];
for(int i=0;i<n;i++)
{
int index = HashIndex(a[i]);//寻找a[i]的下标,并且在hash表查找该值是否存在,不存在我们则以链表形式插入。
NodeTable[index].data=1;//初始化为-1,表示在该下标下面没有数值,如果出现index等于该下标则将该下标标记为1,表示有东西存着呢!
Node* p = NodeTable[index].next;
while(p!=NULL && p->data!=a[i])
{
p=p->next;
}
if(p==NULL)
{
Node *s = new Node();
s->data = a[i];
NodeTable[index].next=s;
}
}
}
void Show()
{
for(int i=0;i<7;i++)
{
if(NodeTable[i].data!=-1)
{
Node *p = NodeTable[i].next;
while(p!=NULL)
{
cout<<" "<<p->data<<" ";
p = p->next;
}
}
}
cout<<endl;
}
int HashIndex(int x)
{
return x%7;
}
private:
Node *NodeTable;
};
int main()
{
int a[]={1,2,2,1,1,1,3,4,5};
Hash sh(a,9);
sh.Show();
return 0;
}
#include <iostream>
#include <stdlib.h>
using namespace std;
//粗暴的删减法,时间复杂度稍微高了一些,空间复杂度比较低。
void Grial(int a[],int& n)//这里的n用引用传入,因为数组大小会在我删减重复数值时动态改变,引用传入,我就不需要记录n的实际值了。
{
int i=0;
int j;
int k;
for(;i<n;)
{
for(j=i+1;j<=n;j++)
{
if(a[i]==a[j])
{
for(k=j;k<n;k++)
{
a[k]=a[k+1];//删除与a[i]重复的值,并且将n减1;
}
n--;
}
if(j>=n)
{
i++;
}
}
if(a[i]==a[i+1])
{
for(k=i;k<n;k++)
{
a[k]=a[k+1];
}
n--;
}
}
}
int main()
{
int a[100];
for(int i=0;i<100;i++)
{
a[i]=rand()%100;
}
int b=99;
Grial(a,b);
for(int i=0;i<b;i++)
{
cout<<a[i]<<endl;
}
return 0;
}C++中删除重复的数据并且输出(相当与shell脚本里面的sort -u)
标签:
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/45306337