C++中删除重复的数据并且输出(相当与shell脚本里面的sort -u)

//问题:
//给你一个数组,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;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。