目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 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在线答疑。