字符串碎片
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:‘aaa’,‘bb’,‘c’。
现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少,结果直接取整,无需保留小数。
输入例子1:
“aaabbaaac”
输出例子1:
2
例子说明1:所有碎片的平均长度= (3 + 2 + 3 + 1) / 4 = 2
我们要的结果是:
平均碎片长度=(各碎片长度总和)/ 有多少份碎片
各碎片长度总和其实就是字符串长度
那么需要计算的就是 碎片份数
public class Main {
/*
这里是需要填写的方法
*/
public static int GetFragment (String str) {
//如果长度是0直接输出0
if (str.length()==0){
return 0;
}
//统计有多少份碎片
int count = 0;
//写一个数组用于存入每份碎片的长度,大小跟字符串一样长不会溢出
int[] length = new int[str.length()];
//记录当前是第几份碎片
int x = 0;
for(int i=0;i<str.length()-1;i++){
//他是第x份碎片并且数据为0时,更改为1,因为每一份至少长度为1
if (length[x]==0){
length[x]=1;
}
//如果当前下标字符跟下一个字符相同则长度+1
if(str.charAt(i)==str.charAt(i+1)){
length[x]++;
}else{
//不相同则跳到下一份
x++;
//份数+1
count++;
}
}
int sum = 0;
//拿数组里的值累加,统计总长度
for(int i = 0;i<count;i++){
sum = length[i] + sum;
}
/*
如果总长度跟输入的字符串不相等,说明以上循环最后一个下标跟
倒数第二个不同,最后一份长度必是1,所以份数需要+1
(这就是为什么我们要计算每份长度的原因,因为循环会概率性漏算最后一个)
*/
if(sum!=str.length()){
return str.length()/(count+1);
}
//如果相等就直接除
return str.length()/count;
}
//输出测试结果
public static void main(String[] args) {
System.out.println(GetFragment("aaabbaaac"));
}
}