一、题目描述
给定一个非空字符串Str,字符串中间可能含有数字0,对于数字0,则替换成符号”-“,由此生成多个由”-“分割的子串。对于新组成的每一个子串,则将这个子串的所有字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有字母转换为大写字母;大小写字母的数量相等时,不做转换。
示例:
12Abc0deAbc03aA
输出
12Abc-deabc-3aA
二、代码与测试
1.参考代码
代码如下(示例):
Scanner sc = new Scanner(System.in);
String source = sc.nextLine();
String[] split = source.split("0");
for (int i = 0; i < split.length; i++) {
String s1 = split[i].replaceAll("[1-9]", "");
String s2 = s1.replaceAll("[a-z]", "");
if (s2.length() > s1.length() / 2) {
split[i] = split[i].toUpperCase();
} else if (s2.length() < s1.length() / 2) {
split[i] = split[i].toLowerCase();
}
}
for (int i = 0; i < split.length; i++) {
if (i == 0) {
System.out.print(split[i]);
} else {
System.out.print("-" + split[i]);
}
}
2.边界测试
代码如下(示例):
12Abc0deAbc03aA
12Abc-deabc-3aA
----------------------
643Ahff03fdsGDe0fdj5G
643ahff-3fdsgde-fdj5g
----------------------
Abhfd0432530aFJ8Kd0fD6
abhfd-43253-AFJ8KD-fD6
----------------------
A8B9c6k0p08sMFL0saQ
A8B9c6k-p-8SMFL-saQ
测试用例全部通过。
总结
本题的要求是以0为特征对字符串进行分串,因此首先考虑使用字符串的split方法进行切割,从而获得各段子串,再根据题目要求对子串中的大小写字母进行对比,判断出哪个占比大,这里使用了字符串类中的替换方法,先去除数字避免下一步做大小写字母占比时影响,去除数字后得到纯字母子串,再进行一次替换去除全部大写或小写字母,再把处理过的纯大写或小写字母子串长度与前一步的子串长度对比即可得出,之后再用字符串的大小写转换方法处理后将新值重赋给原位置的字符串数组。之后按照题目要求格式循环输出即可。