7-13 刪除重復字符 (20分)


7-13 刪除重復字符 (20分)
 

本題要求編寫程序,將給定字符串去掉重復的字符后,按照字符ASCII碼順序從小到大排序后輸出。

輸入格式:

輸入是一個以回車結束的非空字符串(少於80個字符)。

輸出格式:

輸出去重排序后的結果字符串。

輸入樣例:

ad2f3adjfeainzzzv
 

輸出樣例:

23adefijnvz

第一種辦法:雖然我利用了占坑前移的想法,但是算法還是O(n^2)的 ,不好,可以利用標志變量把它簡化為o(n)(指的是不把快排包括在內),
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 int cmp(const void *a,const void *b)
 5 {
 6     return *(char  *)a-*(char *)b;
 7 }
 8 int main()
 9 {
10     int i,j;
11     char  a[100];
12     gets(a);
13     int str=strlen(a);
14     int count;
15     for(i=0;a[i]!='\0';i++)
16     {
17         count=0;
18         for(j=i+1;a[j]!='\0';j++)
19         {
20             if(a[j]!=a[i])
21             a[j-count]=a[j];
22             else
23             count++;
24         }
25         str-=count;
26         a[str]='\0';
27     }
28 
29     qsort(a,str,sizeof(a[0]),cmp);
30     for(i=0;i<str;i++)
31     printf("%c",a[i]);
32     printf("\n");
33     
34     
35     return 0;
36 }

 第二種辦法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(char  *)a-*(char *)b;
}
int main()
{
    int i,j;
    char  a[100];
    int hash[128]={0};
    gets(a);
    int str=strlen(a);
    int count=0;
    for(i=0;a[i]!='\0';i++)
    {
        if(hash[a[i]]!=0)  //說明前面出現過,可以作為坑,給其他人填了
        count++;
        else
        {
        a[i-count]=a[i];
        hash[a[i]]=1;
        }
    }
    str=str-count;
    a[str]=0;
    qsort(a,str,sizeof(a[0]),cmp);
    printf("%s\n",a);


    return 0;
}

 

 


免責聲明!

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



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