欢迎光临散文网 会员登陆 & 注册

《编程思维与实践》1026.字串非重复字符数排序

2023-04-07 09:49 作者:风浅叶墨  | 我要投稿

题目


用结构体存储字符串的首地址和不同字符的个数.

关键点在于不同字符个数的求法:

可以考虑利用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;
}


《编程思维与实践》1026.字串非重复字符数排序的评论 (共 条)

分享到微博请遵守国家法律