华为OD机试 - 字符串分割(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
      • 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、解题思路:

  1. 先取出第一个字符串,特殊处理;
  2. 将剩余字符串的分隔符全部替换掉;
  3. 每K个字符进行一次分割;
  4. 根据题意,进行大小写转换,再用分隔符-拼接;
  5. 最后输出转换后的字符串。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {

    /**
     * 要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
     * 

* 对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母; * 反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母; * 大小写字母的数量相等时,不做转换。 * * 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、说明

  1. 除第一个子串外,Nezha-
  2. 剩余字符串,去掉分隔符-,Loves@LEarnIng##Java
  3. 每3个进行分割,Lov-es@-LEa-rnI-ng#-#Ja-va
  4. 大写小写转换(哪个少转哪个,相等则不转),变为lov-es@-LEA-rni-ng#-#Ja-va
  5. 最后输出Nezha-lov-es@-LEA-rni-ng#-#Ja-va

华为OD机试 - 字符串分割(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,算法,送书,学习方法)