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

news/2024/7/20 18:38:13 标签: 华为od, 算法, 送书, 学习方法

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
      • 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个字符组成新的子串,并用‘-’分隔。
     * <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、说明

  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卷 200分 考生抽中题】

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

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

在这里插入图片描述


http://www.niftyadmin.cn/n/4991432.html

相关文章

Java on VS Code 8月更新|反编译器用户体验优化、新 Maven 项目工作流、代码高亮稳定性提升

作者&#xff1a;Nick Zhu 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Visual Studio Code for Java 的 8 月更新&#xff01;在这篇博客中&#xff0c;我们将为您提供有关反编译器支持的更多改进。此外&#xff0c;我们将展示如何创建没有原型的 Maven 项目以及一…

vue3渲染函数h的简单使用——定义局部组件

vue3渲染函数h的简单使用 基本用法 创建 Vnodes Vue 提供了一个 h() 函数用于创建 vnodes&#xff1a; import { h } from vueconst vnode h(div, // type{ id: foo, class: bar }, // props[/* children */] )更多用法 详情查看官方文档 在SFC中定义局部组件使用 h函数…

Mac 如何判断下载Mac with Intel Chip 还是 Mac with Apple Chip

如下图&#xff0c;当我们在 Mac系统 下载客户端时&#xff0c;有两种选择&#xff1a;Mac with Intel Chip 、 Mac with Apple Chip 如何判断要下载哪一种&#xff1f; 需要判断本机Mac是在Inter芯片还是Apple芯片上运行的。方法如下&#xff1a; 点击屏幕左上角Apple标志&a…

C++中常量#define和const修饰符区别

目录 1、常量需要初始化值 2、1类型和安全检查不同 2、2编译器处理不同 2、3存储方式不同 2、4定义域不同 2、6是否可以做函数参数 3、 const关键字 4、#define关键字 5、const在指针上的应用 1、常量需要初始化值 //错误写法 const double pi;//会报未初始化本地变…

C++中使用for循环

C中使用for循环 for 语句是一种更复杂的循环&#xff0c;因为它允许您指定执行一次的初始化语句&#xff08;通常用于初始化计数器&#xff09;、 检查退出条件&#xff08;通常使用计数器&#xff09;并在每次循环末尾执行操作&#xff08;通常是将计数器递增或修改其值&…

【云原生进阶之PaaS中间件】第一章Redis-2.5缓存持久化

1 Redis持久化 1.1 Redis持久化分类 Redis 中的数据都是保存在内存中的&#xff0c;当Redis服务重启后&#xff0c;内存中的数据都会丢失&#xff0c;所以需要将内存中的数据保存到磁盘上&#xff0c;方便系统故障时&#xff0c;从磁盘上的备份数据恢复到内存中。 Redis 中的持…

企业文件加密防泄密软件系统——「天锐绿盾」

天锐绿盾是一款企业电子文件透明加密安全防泄密管理系统&#xff0c;采用文件过滤驱动技术&#xff0c;对电子文档进行实时动态保护&#xff0c;防止企业计算机信息被破坏、丢失、泄密等安全问题。 PC访问地址&#xff1a; 首页 以下是关于天锐绿盾的详细介绍&#xff1a; 透明…

代码随想录算法训练营day52 | LeetCode 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

300. 最长递增子序列&#xff08;题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台&#xff09; 思路&#xff1a;今天开始了dp的又一类超经典题目&#xff0c;最长递增子序列。依然是dp数组构造四部曲&#xff1a;1.确定dp数组的…