华为OD E卷(100分)32-字符串分割
前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。
题目描述
给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。
输入
输入为两行,第一行为参数K,第二行为字符串S。
输出
输出转换后的字符串。
示例
示例1
输入
3
12abc-abCABc-4aB@
输出12abc-abc-ABC-4aB-@
说明
子串为12abc、abCABc、4aB@,第一个子串保留,后面的子串每3个字符一组为abC、ABc、4aB、@,abC中小写字母较多,转换为abc,ABc中大写字母较多,转换为ABC,4aB中大小写字母都为1个,不做转换,@中没有字母,连起来即12abc-abc-ABC-4aB-@
示例2
输入
12
12abc-abCABc-4aB@
输出12abc-abCABc4aB@
说明
子串为12abc、abCABc、4aB@,第一个子串保留,后面的子串每12个字符一组为abCABc4aB@,这个子串中大小写字母都为4个,不做转换,连起来即12abc-abCABc4aB@
题解
Java实现
package huawei.e100;
import java.util.Scanner;
/**
* @author arnold
* @date 2024年12月21日
* 字符串分割
*/
public class T32 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int index = sc.nextInt();
sc.nextLine();
String str = sc.nextLine();
String res = run(str, index);
System.out.println(res);
}
}
static String run(String str, int k) {
String[] tmps = str.split("-");
StringBuilder sb = new StringBuilder();
sb.append(tmps[0]);
StringBuilder sb1 = new StringBuilder();
for (int i = 1; i < tmps.length; i++) {
sb1.append(tmps[i]);
}
String newStr = sb1.toString();
int num = newStr.length()/k +1;
for (int i = 0; i < num; i++) {
String item = newStr.substring(k*i, Math.min(k*i + k, newStr.length()));
int low = 0, up = 0;
for (int j = 0; j < item.length(); j++) {
if(item.charAt(j) >= 'a' && item.charAt(j) <= 'z') {
low ++;
} else if(item.charAt(j) >= 'A' && item.charAt(j) <= 'Z') {
up ++;
}
}
if (up > low) {
sb.append("-").append(item.toUpperCase());
} else if (up == low) {
sb.append("-").append(item);
} else {
sb.append("-").append(item.toLowerCase());
}
}
return sb.toString();
}
}