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;
}