一個由小寫字母組成的字符串可以看成一些同一字母的最大碎片組成的。例如,”aaabbaaac”是由下面碎片組成的:’aaa’,’bb’,’c’。牛牛現在給定一個字符串,請你幫助計算這個字符串的所有碎片的平均長度是多少。
輸入描述:
輸入包括一個字符串s,字符串s的長度length(1 ≤ length ≤ 50),s只含小寫字母(‘a’-‘z’)
輸出描述:
輸出一個整數,表示所有碎片的平均長度,四捨五入保留兩位小數。
如樣例所示: s = “aaabbaaac”
所有碎片的平均長度 = (3 + 2 + 3 + 1) / 4 = 2.25
輸入例子1:
aaabbaaac
輸出例子1:
2.25
/*
思想:
1、先將字符串第一個字符作爲被比較字符,順序向後進行比較
2、如果用來比較的字符與被比較字符相同,則用來統計字符串碎片長度的變量+1
如果不同,則將比較字符變成被比較字符,並從該字符位置向後順序比較,且使用一個新的變量
對字符串碎片長度進行統計。
3、最後將所有保存字符串碎片長度的變量取平均數並返回輸出
*/
#include<iostream>
#include<string>
#include<iomanip.h>
using namespace std;
float calc(string s)
{
//字符串碎片長度統計數組,該數組用來保存每組字符串碎片的長度,如aab,則數組下標0和1的變量值爲2 1
int count[50]={0};
//保存字符串碎片統計數組的下標
int indexCount=0;
//保存字符串中當前被比較字符的下標
int indexCompared;
//保存字符串中當前用來比較的字符的下標
int indexCompare;
for(indexCompared=0;indexCompared<=s.length();indexCompared++)
{
for(indexCompare=indexCompared+1;indexCompare<=s.length();indexCompare++)
{
//如果被比較字符和比較字符相等,則字符串碎片統計數組當前下標的變量值+1
if(s[indexCompared]==s[indexCompare])count[indexCount]++;
else
{
//被比較字符和比較字符不相等,字符串碎片統計數組變量還要+1的原因
//如字符串 abcde ,第一個字符和第二個字符不相同,
//此時第一組字符串碎片長度爲1,需要執行+1操作
count[indexCount]++;
//因爲不相等,所以字符串碎片數組下標+1,用新的數組變量統計新的字符串碎片
indexCount++;
//此處將比較字符變爲被比較字符
//本應indexCompared=indexCompare;
//因循環時會自動執行indexCompared++,所以此處-1
indexCompared=indexCompare-1;
break;
}
}
}
indexCount=0;
float value=0;
//對字符串碎片統計數組前面不等於0的變量的值求和
while(count[indexCount]!=0)
{
value+=count[indexCount];
indexCount++;
}
//返回平均數
return value/(indexCount-0.0);
}
int main()
{
string s;
cin >> s;
//格式控制2位小數
cout<< setiosflags(ios::fixed)<<setprecision(2)<<calc(s);
system("pause");
}