目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 1、根据题意:
- 2、例如:
- 3、解题思路:
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。
二、输入描述
输入为两行,第一行为参数K,第二行为字符串S。
三、输出描述
输出转换后的字符串。
输入 | 输出 | 说明 |
---|---|---|
3 12abc-abCABc-4aB@ | 12abc-abc-ABC-4aB-@ | |
12 12abc-abCABc-4aB@ | 12abc-abCABc4aB@ |
四、解题思路
题目刷多了的话,一看这道题,第一反应就是没意思。。
完全根据题意去做就可以了,美其名曰“逻辑分析”。
1、根据题意:
要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;
大小写字母的数量相等时,不做转换。
2、例如:
- 3
- 12abc-abCABc-4aB@
- 12abc-abc-ABC-4aB-@
秒懂吧?
3、解题思路:
- 先取出第一个字符串,特殊处理;
- 将剩余字符串的分隔符全部替换掉;
- 每K个字符进行一次分割;
- 根据题意,进行大小写转换,再用分隔符-拼接;
- 最后输出转换后的字符串。
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest02 {
/**
* 要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
* <p>
* 对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
* 反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;
* 大小写字母的数量相等时,不做转换。
*
* 3
* 12abc-abCABc-4aB@
* 12abc-abc-ABC-4aB-@
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int K = Integer.valueOf(sc.nextLine());
String S = sc.nextLine();
// 除第一个子串外
String first = S.split("-")[0];
StringBuilder builder = new StringBuilder();
builder.append(first).append("-");
// 除了第一个字符串的余下字符串
String line = S.replaceFirst(first + "-", "").replace("-", "");
// 不满K个字符,直接拼接
if (line.length() <= K) {
builder.append(line).append("-");
} else {
while (line.length() > 0) {
// 每K个字符一截取
if (line.length() > K) {
String temp = line.substring(0, K);
line = line.replaceFirst(temp, "");
builder.append(transfer(temp)).append("-");
} else {
builder.append(transfer(line)).append("-");
line = "";
}
}
}
// 去掉最后一个-
builder.deleteCharAt(builder.length()-1);
System.out.println(builder);
}
/**
* 如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
* 反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;
* 大小写字母的数量相等时,不做转换。
*/
static String transfer(String str) {
int upper = 0;
int lower = 0;
char chArr[] = str.toCharArray();
for (char c : chArr) {
if (c >= 'a' && c <= 'z') {
lower++;
}else if(c >= 'A' && c <= 'Z'){
upper++;
}
}
if (upper > lower) {
str = str.toUpperCase();
} else if (upper < lower) {
str = str.toLowerCase();
}
return str;
}
}
六、效果展示
1、输入
3
Nezha-Loves-@LEarnIng-##Java
2、输出
Nezha-lov-es@-LEA-rni-ng#-#Ja-va
3、说明
- 除第一个子串外,Nezha-
- 剩余字符串,去掉分隔符-,Loves@LEarnIng##Java
- 每3个进行分割,Lov-es@-LEa-rnI-ng#-#Ja-va
- 大写小写转换(哪个少转哪个,相等则不转),变为lov-es@-LEA-rni-ng#-#Ja-va
- 最后输出Nezha-lov-es@-LEA-rni-ng#-#Ja-va
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。