《编程思维与实践》1026.字串非重复字符数排序
题目
思路
用结构体存储字符串的首地址和不同字符的个数.
关键点在于不同字符个数的求法:
可以考虑利用ASCII码与字符对应的关系,开一个数组初始化为0记录每一个字符是否出现:
每读到一个字符,如果之前没有存入(数组值为0)则值加1,否则值不变.
需要注意的点:
不能在循环里开一个数组,每循环一次读一次然后存指针,因为这样子有可能在循环开数组中出现地址相同的情况,那么最后得到的所有内容都会变成最后读入的内容.
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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) //不同字符数不同
{
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]; //在循环外开好数组
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++) //求出现几种字符
{
if(count[s[j][k]]==0)
{
count[s[j][k]]++;
}
}
for(int k=0;k<128;k++)
{
tab[j].difernumber+=count[k]; //不同字符数
}
}
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;
}