[网易2018校招java笔试题]字符串碎片(java语言实现)

题目描述:

[编程题] 字符串碎片

时间限制:1秒

空间限制:32768K

一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"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

解题思路:

        先将字符串“wwwwssffiuuuuusssssooooolllsssssshhhhcccchhhhhllo"中的各个字符出现的次数记录成一个数组。然后在将该数组求一下平均值,最后再结果上做一个四舍五入也即是输出结果格式化。

实现代码(JAVA语言):

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class StringNum {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String num = in.nextLine();
		int nub = 1;
		char[] s1 = num.toCharArray();
		for (int i = 0; i < s1.length - 1; i++) {
			if (s1[i] != s1[i + 1])
				nub++;                    //计算出所有字母的种类
		}
		int s[] = new int[nub];        
		
		//计算出每种字母出现的次数
		for (int i = 0, j = 0; i < s1.length; i++) {
			if (i < s1.length - 2) {
				if (s1[i] == s1[i + 1]) {
					s[j] = s[j] + 1;
				} else if (s1[i] != s1[i + 1]) {
					s[j] = s[j] + 1;
					j++;
				}
			} else if (i == s1.length - 2) {
				if (s1[i] == s1[i + 1])
					s[j] = s[j] + 2;
				else if (s1[i] != s1[i + 1]) {
					s[j] = s[j] + 1;
					s[j + 1] = s[j + 1] + 1;
				}
			}
		}
		float result =0 ;
		for(int ss: s) {
	
			result +=ss;
		}
		
		double result1 = result/s.length;
		 java.text.DecimalFormat df =new  java.text.DecimalFormat("#.00");
		 String str = df.format(result1);
		System.out.println(str);
		//BigDecimal re = new BigDecimal(result + "");              //这种方法也可以做精度最格式化
		//System.out.println(re.divide(BigDecimal.valueOf(nub), 2, RoundingMode.HALF_UP).toString());

	}

}


总结:本算法题的实现思路并不难,基础知识对于循环和条件的结构有所考察,对结果的处理要求使用四舍五入的格式保留两位数。考察的综合能力比较强。所以大家一定要重视基础知识。


你可能感兴趣的:(数据结构与算法Java语言描述)