13:整數去重(1.9)


分析:

方法1:先使用數組a記錄,然后使用雙重循環逐個比較,把不重復的數值記錄到b中。時間復雜度O(n^2)(n=10000)超時;

方法2:先使用數組a記錄,然后對數組進行排序。再掃描一遍a,將不重復的數值記錄在b數組.

 STL里面有個sort函數,sort 可以對給定區間所有元素進行排序,默認的排序方式是升序。
但使用這個函數,需要包含頭文件<algorithm>和 using namespace std;
 使用方法舉例:
int a[1000],要對從a[0]到a[49]的元素進行排序,只要寫sort(a,a+50)就行了。

 (    sort函數可以傳兩個參數或三個參數。第一個參數是要排序的區間首地址,第二個參數是區間的尾地址的下一地址。)

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[21000],b[21000];
int main(){
    int x,y,n,maxn=-1,num=1,t=0;
    scanf("%d",&n);
    for(int i=0;i<=n-1;i++)    scanf("%d",&a[i]);
    sort(a,a+n);
    b[0]=a[0];
    for(int i=1;i<n;i++)    
        if (a[i]==a[i-1]);
        else {
            t++;b[t]=a[i];
        }
    for(int i=0;i<=t-1;i++) printf("%d ",b[i]);
    printf("%d\n",b[t]);            
    return 0;
}
View Code

方法3:可以不排序嗎?

v先使用數組a記錄,然后使用雙重循環逐個比較,把不重復的數值記錄到b中。時間復雜度O(n^2)(n=10000)超時;
 或者
v使用標記數組f,如果數值x,出現則f[x]=1.
v邊讀入邊處理,使用b數組記錄沒有重復出現的數值。
v     讀入x,如果f[x]!=1,則b[t]=x
vt為當前讀入的數值中,不同的數值個數即b數組的下標。
v
 
#include<cstdio>
int f[21000]={0},b[21000];
int main(){
    int n;
    scanf("%d",&n);
    int x,t=0;
    for(int i=1;i<=n;i++)   { 
        scanf("%d",&x);
        if (!f[x]){//判斷x是否出現過,沒出現過則記錄同時存儲 
            f[x]=1;//記錄x出現過 
            t++;//b數組的下標 
            b[t]=x;
        }
    }
    for(int i=1;i<=t-1;i++) printf("%d ",b[i]);
    printf("%d\n",b[t]);            
    return 0;
}
View Code

 

 

思考:不使用數組可以嗎?

//邊讀入邊處理,用c數組記錄每個數x是否出現過,如果第一次出現直接輸出llh版本
#include<cstdio>
#include<iostream>
using namespace std;
int c[20005];
int main()
{
    int n,i,x;
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>x;
        if(c[x]==0)//如果x第一次出現直接輸出,同時c[x]標志1
        {
            cout<<x<<' ';
            c[x]=1;
        }
    }
    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM