//问题: //给你一个数组,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; }
时间: 2024-11-02 23:38:00