codewar题目练习

codewar做题目

题目要求从字符串中选出一组相同字符数最多的字符及个数。例如:
“aaabbbbcdddddd” ‘d’-----6
“aabbc” ‘a-’----2
“ss445666gg7” ‘ 6’-----3

思路:用结构体存放新变化的字符,并根据所在标号,把标号的变化值存入已存入结构体的字符相对应的变化值变量中。“aaabbbbcdddddd”
存入结构体数组中的每组字符分别是:’a’,‘b’,‘c’,‘d’,’\0’,分别存入五个结构体中。
根据标号:a–0,
b --3
c—7
d----8
\0—14
先建立标号数组:0,3,7,8,14。
再计算变化值:3-0=3
7-3=4
8-7=1
14-8=6
生成4个变化值,并存入4个结构体数组中
此时:结构体数组只要其中0-3个就可以了
分别是3–‘a’,4–‘b’,1–‘c’,6–‘d’
然后,进行一次排序,把变化值最大值排到最前或最后(每次用第一项与后面的比较),小的就交换数据(变化值和字符都要同时交换)
最后,最前面【0】项就是要求解的值。

#include <stdio.h>

int main()
{
    char *str = "aabbc";
    int i;
    int j = 0;
    int count = 0;
    int arr[256]={0};//存放标号

    struct char_count
    {
        //这样设置的好处是,只要求出变化值的最大值,其对应的字符也可以求出。

        int sum;//存放变化值,每个变化值对应首字符,例如‘aabbbc'--变化值为2--’a',3---'b',1---'c'
        char find;//存放变化后的首个字符
    }cc[256];//用结构体存放每一组数据(其中一个字符,对应一个标号)

    int temp;
    char ctemp;

    for(i=0;i<strlen(str)+1;i++)
        {

            arr[j] = count;//把每种字符的起始标号存入一个数组中。例如'a'-0,'b'-2
            cc[j].find =str[count];

            if(str[i+1]!=str[i])
            {
                printf("char='%c',count=%d\n",str[count],count);
                count = i+1;//当字符之间有差异时,就记录下这个改变后字符的标号

                j++;//存放标号的数组的计数值,每次有新的标号时自增,以连续存放标号到数组中。

            }

        }

    //显示起始字母的标号,及起始字符
    for(i=0;i<j;i++)
    {
        printf("'%c'--%d\n",cc[i].find,arr[i]);

    }
    putchar('\n');

    for(i=0;i<j;i++)
    {
        cc[i].sum = arr[i+1]-arr[i];//将变化值存入结构体数组中
    }


    for(i=0;i<j-1;i++)
    {
        printf("%d ",cc[i].sum);
    }

    putchar('\n');



    for(i=0;i<j-1;i++)
    {
        if(cc[0].sum<cc[i+1].sum)
        {
            //对结构体中的数字排序出最大项,排在首位
            temp = cc[i+1].sum;
            cc[i+1].sum= cc[0].sum;
            cc[0].sum = temp;
            //对结构体中的字符也随数字排序,最大数字中的字符排在首位
            ctemp = cc[i+1].find;
            cc[i+1].find = cc[0].find;
            cc[0].find = ctemp;
        }

    }

    for(i=0;i<j-1;i++)
    {
        printf("%d----%c\n",cc[i].sum,cc[i].find);
    }


    printf("The max char is:'%c',and have number is:%d\n",cc[0].find,cc[0].sum);

    putchar('\n');





    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值