uva 例题4-1 qsort 快速排序算法

题意:给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重拍排,然后对26个字母做一个一一映射,使两个字符串相同。

uva提示:字母的位置不重要,重要的是每个字母出现的次数。

先统计出两个字符串中各个字母出现的次数,得到两个数组。

只要两个数组排序之后结果相同,一一映射就相同。


解题关键点:qsort库函数。(炒炒炒炒炒鸡厉害的排序函数 很重要!)

包括四部分参数。

qsort(数组起始地址,数组长度(元素个数),sizeof(a[0])/(int)*, cmp(一个关于从小到大或者从大到小的函数));

* :这里是用来表示一个元素所占字节大小 sizeof(a[0])  sizeof(int) 这是两种写法 都表示 每个数组元素的内存大小

注:sizeof是求字节数的函数。a如果是int,float ,long的就是4个字节。short的就是2个。char的就是1个 double的就是8个,(32位系统)

声明完这四部分之后。其中cmp部分需要我们再声明一个独立的函数。

如:

int cmp(const void *n,const void *m )//这里是递减排序
{
    return *(int*)m-*(int*)n;
}


int cmp(const void *n,const void *m )//递增排序
{
    return *(int*)n-*(int*)m;
}

具体关于这个函数的解释 可以去看紫书的P73页。 也可以百度qsort函数查到这个函数的用法。


代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char a[101];
char b[101];
int cmp(const void *n,const void *m )//递减排序
{
    return *(int*)m-*(int*)n;
}

int main()
{
    int i;
    while(scanf("%s",a)!=EOF)
    {
        scanf("%s",b);
        int n;
        n=strlen(a);
        int c[30],d[30];
        memset(c,0,sizeof(c));//将数组清零
        memset(d,0,sizeof(d));
        for(i=0;i<n;i++)
        {
            c[a[i]-'A']++;//记录每个字母个数(只是为了记录不同字母他们的个数,不是为了记录每个对应字母对应的个数)
            d[b[i]-'A']++;//因为这个题只需要比较相同的字母个数是不是一一对应即可。
        }
        qsort(c,27,sizeof(c[0]),cmp);//qsort函数排序
        qsort(d,27,sizeof(d[0]),cmp);
        int flag;
        ans=1;
        for(i=0;i<27;i++)
        {


                if(c[i]!=d[i])
                {
                    flag=0;//判断两个数组中元素是不是相同对应个数的标志
                    break;
                }


        }
        if(flag==1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/zhengyuan233/article/details/53267303