题目描述
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:"aaa","bb",‘c’。输入字符串,请计算字符串的所有碎片及所有碎片的平均长度。
所有碎片的平均长度 = 所有碎片长度之和/碎片个数
输入
测试次数t
每组测试数据为一行字符串
输出
对每组测试数据,输出字符串中按顺序出现的碎片和所有碎片的平均长度(相同碎片只输出一次,平均长度保留2位小数)。
输入输出样例
输入样例1 <-复制
4
aaabbaaac
szuszuszuszu
aaaaaa
apple
输出样例1
aaa bb c 2.25
s z u 1.00
aaaaaa 6.00
a pp l e 1.25
AC代码
#include<stdio.h>
#include<string.h>
int main()
{
int t; //t是次数
int i,j,k,l; //i,j,k,l用来做数组下标
int y,h,q; //
double avelong,alllong,geshu;//平均长度,总长度,个数
char c; //c用来判断连续字符是否相等
scanf("%d",&t);
getchar();
while(t--)
{
char a[1000]={0},b[100][100]={0};
//a数组存输入数据 ,b数组将a分割后按字符串存入
int flag[1000]; // flag数组用来标志分割a数组
memset(flag,0,4000); //重置数组很重要!!!
geshu=0;
gets(a);
alllong=strlen(a); //得到总长度
c=a[0]; //小细节!!!
for(i=0;a[i]!='\0';i++)
{ //用flag数组标志a数组字符串分割点
if(c==a[i])
continue;
else
{
geshu++;
c=a[i];
flag[i-1]=1;//细节:是i-1而不是i
}
}
geshu++;//细节,个数最后还要加一
avelong=alllong/geshu;
for(i=0,j=0,k=0;a[i]!='\0';i++)
{ //分割a数组成字符串存入b数组
b[j][k]=a[i];
k++;
if(flag[i]==1) //利用flag数组的标志进行分割
{
b[j][k]='\0';
j++;
k=0;
}
}
b[j][k]='\0';//注意补上最后一个(细节!!!)
for(i=0;i<=j;i++)
{
for(h=0;h<i;h++) //此处判断当前字符串是否与前面字符串相等
if(strcmp(b[h],b[i])==0)
y=1; //注意continue不能放这,注意跳过的是哪一个for循环!!!
if(y==1)
{
y=0;
continue;
}
for(l=0;b[i][l]!='\0';l++)
printf("%c",b[i][l]);
printf(" ");
}
printf("%.2lf\n",avelong);
}
}
(by 归忆)