//问题:
//给你一个数组,a[]={1,1,1,1,1,2,2,2,2,3,3,3,4,5,6}
//要输出的结果是1,2,3,4,5,6.(去除重复的数字,要求时间空间的考虑).
#include
using namespace std;
template
class Bitset
{
public:
Bitset()
{
_Tidy();//调用_Tidy()函数会初始化所有位为0.
}
void Show()//显示01位.
{
for(int _I=0;_I<_N;_I++)
{
cout<<(test(_I)?'1':'0');
}
}
bool test(int _P)//测试该位置是否为真(1).
{
int _I = _P/32;
return (A[_I]>>(_P%32))&0x1;
}
void _Tidy()
{
for(int _I=0;_I<_W;_I++)
{
A[_I] = 0;
}
}
void set(int _P)//将_p下标设置为1.
{
int _I = _P/32;
A[_I] |= (0x1<<(_P%32));
}
void printf()
{
for(int _I=0;_I<_N;_I++)
{
test(_I) && (cout<<_I<<" ");
}
}//打印排列结果.
private:
typedef long LONG;//以long的4个字节为一个单位数组.
enum{_Nw=(_N-1)/(sizeof(LONG)*8),
_W=_Nw+1};
int A[_W];
};
int main()
{
Bitset<600> a;
int b[]={1,1,1,1,2,2,3,3,34,2,423,42,34,23,1,1,3,213,123,21,3,3,4,32,543,5,46,3,45,35,23,42,3};
for(int i=0;i<33;i++)
{
a.set(b[i]);
}
a.printf();
}
下面有两种粗暴的方法。
#include
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;idata!=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<<" "<data<<" ";
p = p->next;
}
}
}
cout<
#include
using namespace std;
//粗暴的删减法,时间复杂度稍微高了一些,空间复杂度比较低。
void Grial(int a[],int& n)//这里的n用引用传入,因为数组大小会在我删减重复数值时动态改变,引用传入,我就不需要记录n的实际值了。
{
int i=0;
int j;
int k;
for(;i=n)
{
i++;
}
}
if(a[i]==a[i+1])
{
for(k=i;k