活动地址:CSDN21天学习挑战赛
给定一个非空字符串S,其被N个‘-’分隔为N+1个的字串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;如果大小写字母数量一样多则不做转换。
输入示例
3
12abc-abCABc-4aB@
输出
12abc-abc-ABC-4aB-@
说明
子串为12abc、abCABc、4aB@,除去第一个子串,剩余的按照3个字符分隔,则新的子串为12abc、abC、ABc、4aB、@,然后各个子串计算大小写字母个数转换大小写,则变为12abc、abc、ABC、4aB、@,最后由‘-’拼接得到结果。
根据题目可以知道基本可以分为以下两个处理步骤
那么问题就变简单了,第一个问题:按照定长切割字符串。
public String split(String str, int n) {
//子串长度
int len = str.length();
//长度不够,直接返回
if (len <= n)
return str;
//第一次切割
String res = str.substring(0,n);
//定义切割起始位置
int start = n;
while (start < len) {
//定义切割末尾位置,避免超出子串长度
int end = Math.min(start + n, len);
//切割并拼接
res += "-" + str.substring(start, end);
//下次切割位置
start = end;
}
return res;
}
其中需要注意的就是切割避免超出子串长度,然后就是循环边界的定义。
接下来解决第二个问题,计算大小写字母数量,并转换大小写。
public String change(String str) {
int len = str.length();
//记录大小写字母数量
int a,b;
a = b = 0;
for (int i=0;i<len;i++) {
char c = str.charAt(i);
//大小写字母计数
if (c >= 'a' && c <= 'z')
a ++;
else if (c >= 'A' && c <= 'Z')
b ++;
}
//大小写字母转换
if (a > b) {
return str.toLowerCase();
}else if (b > a) {
return str.toUpperCase();
}
return str;
}
接下来就是将两个方法结合一下就可以了。
public static void main(String[] args) {
String str = "12abc-acBACbd-QcGbAc@";
int n = 3;
//按照分隔符切割
String[] s1 = str.split("-");
String s = s1[0];
for (int i=1;i<split.length;i++) {
//定长切割
s += "-" + split(s1[i], n);
}
//按照分隔符切割
String[] s1 = s.split("-");
//大小写字母转换
String res = change(s1[0]);
for (int i=1;i<s1.length;i++){
res += "-" + change(s1[i]);
}
//打印结果
System.out.println(res);
}
这里用了两个循环处理,有点消耗性能,其实可以优化调整为一个循环实现。
原文地址