標籤:
//問題: //給你一個數組,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;template<int _N>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 <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++數組操作(重複,排序,bitset)