《編程思維與實(shí)踐》1026.字串非重復(fù)字符數(shù)排序
題目


用結(jié)構(gòu)體存儲(chǔ)字符串的首地址和不同字符的個(gè)數(shù).
關(guān)鍵點(diǎn)在于不同字符個(gè)數(shù)的求法:
可以考慮利用ASCII碼與字符對(duì)應(yīng)的關(guān)系,開(kāi)一個(gè)數(shù)組初始化為0記錄每一個(gè)字符是否出現(xiàn):
每讀到一個(gè)字符,如果之前沒(méi)有存入(數(shù)組值為0)則值加1,否則值不變.
需要注意的點(diǎn):
不能在循環(huán)里開(kāi)一個(gè)數(shù)組,每循環(huán)一次讀一次然后存指針,因?yàn)檫@樣子有可能在循環(huán)開(kāi)數(shù)組中出現(xiàn)地址相同的情況,那么最后得到的所有內(nèi)容都會(huì)變成最后讀入的內(nèi)容.
代碼
typedef?struct{int?difernumber;char*?data;}?Diferstring;
int?cmp(const?void?*a,const?void?*b)
{
????Diferstring?*m=(Diferstring*)a;
????Diferstring?*n=(Diferstring*)b;
????if(m->difernumber!=n->difernumber)???//不同字符數(shù)不同
????{
????????return?n->difernumber-m->difernumber;
????}
????else{
????????return?strcmp(m->data,n->data);??//按字典序
????}
}
int?main()
{
????int?T;
????scanf("%d",&T);
????for(int?i=0;i<T;i++)
????{
????????int?n;
????????scanf("%d",&n);
????????Diferstring?tab[n];
????????char?s[n][21];??//在循環(huán)外開(kāi)好數(shù)組
????????for(int?j=0;j<n;j++)
????????{
????????????scanf("%s",s[j]);??
????????????tab[j].data=s[j];
????????????tab[j].difernumber=0;
????????????int?count[128]={0};??//利用ASCII碼
????????????for(int?k=0;k<strlen(s[j]);k++)??//求出現(xiàn)幾種字符
????????????{
????????????????if(count[s[j][k]]==0)
????????????????{
????????????????????count[s[j][k]]++;
????????????????}
????????????}???????????
????????????for(int?k=0;k<128;k++)
????????????{
????????????????tab[j].difernumber+=count[k];????//不同字符數(shù)
????????????}
????????}
????????qsort(tab,n,sizeof(Diferstring),cmp);
????????printf("case?#%d:\n",i);
????????for(int?j=0;j<n;j++)
????????{
????????????printf("%s\n",tab[j].data);
????????}
????}?
????return?0;
}