java解法

首先输入一个整数 K,表示每个子字符串的最大长度。
接着输入一个字符串 inputString,该字符串由多个部分通过 - 分隔。
字符串分割:

使用 - 分隔符将输入的 inputString 分割成多个部分。
处理子字符串:

对于每个由 - 分隔后的部分(除了第一个部分,其他部分需要处理):
按照给定的最大长度 K 将字符串划分为子字符串。
判断每个子字符串中小写字母和大写字母的数量。
如果小写字母多,则将整个子字符串转为小写;如果大写字母多,则转为大写;如果相等,则保持原样。
返回结果:

最终将处理后的部分合并为一个字符串,每个部分之间仍用 - 分隔。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 读取输入
        int K = scanner.nextInt();  // 每个子字符串的最大长度
        String inputString = scanner.next();  // 输入的字符串
        
        // 输出格式化后的字符串
        System.out.println(formatString(K, inputString));
    }

    // 格式化字符串的方法
    public static String formatString(int K, String inputString) {
        // 按照 "-" 将输入字符串分割成多个部分
        String[] sections = inputString.split("-");
        
        // 使用队列来存储分割后的各个部分
        Queue<String> queue = new LinkedList<>(Arrays.asList(sections));
        
        // 创建 StringBuilder 来构建最终的结果字符串
        StringBuilder finalResult = new StringBuilder(queue.poll());  // 先将第一个部分添加到最终结果
        
        // 使用 StringBuilder 来存储剩余部分的字符
        StringBuilder buffer = new StringBuilder();

        // 将队列中的剩余部分合并到一个缓冲区中
        while (!queue.isEmpty()) {
            buffer.append(queue.poll());
        }

        // 记录当前子字符串中小写字母和大写字母的数量
        int lowerCount = 0, upperCount = 0;
        
        // 用于暂时存储当前正在处理的子字符串
        StringBuilder segmentBuilder = new StringBuilder();

        // 遍历缓冲区的每个字符
        for (int i = 0; i < buffer.length(); i++) {
            char current = buffer.charAt(i);  // 当前字符
            
            // 根据字符的大小写分别统计小写和大写字母的数量
            if (Character.isLowerCase(current)) lowerCount++;
            else if (Character.isUpperCase(current)) upperCount++;

            // 将当前字符添加到当前子字符串的构建器中
            segmentBuilder.append(current);

            // 如果当前子字符串已达到最大长度 K 或是最后一个字符
            if ((i + 1) % K == 0 || i == buffer.length() - 1) {
                // 根据小写字母和大写字母的数量决定如何处理当前子字符串
                if (lowerCount > upperCount) {
                    finalResult.append("-").append(segmentBuilder.toString().toLowerCase());
                } else if (upperCount > lowerCount) {
                    finalResult.append("-").append(segmentBuilder.toString().toUpperCase());
                } else {
                    finalResult.append("-").append(segmentBuilder.toString());
                }

                // 重置计数器和子字符串构建器
                lowerCount = 0;
                upperCount = 0;
                segmentBuilder.setLength(0);  // 清空当前的子字符串
            }
        }

        // 返回格式化后的字符串
        return finalResult.toString();
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

输入一个整数 k,表示每个子字符串的最大长度。
输入一个字符串 s,该字符串由多个部分通过 - 分隔。
处理步骤:

首先按照 - 分隔符将输入字符串 s 分割为多个部分。
然后将这些部分拼接起来,去掉 -,并按照 k 的长度切分成若干子字符串。
对于每个子字符串,判断其中的小写字母和大写字母数量:
如果小写字母多,则将该子字符串转换为小写。
如果大写字母多,则将该子字符串转换为大写。
如果小写和大写字母数量相等,则不做转换。
最终将处理后的子字符串合并回原来的形式,并在各个子字符串之间用 - 连接。

#include 
#include 
#include 
#include   // 引入用于大小写转换的函数
using namespace std;

int k;           // 每个子字符串的最大长度
string s;        // 输入的字符串

// 转换函数:根据小写字母和大写字母的数量来决定是否转换为小写或大写
string convert(const string & str) {
    int lowerCount = 0, upperCount = 0;

    // 遍历字符串,统计小写字母和大写字母的数量
    for (size_t i = 0; i < str.length(); ++i) {
        char c = str[i];
        if (c >= 'a' && c <= 'z') {
            lowerCount++;  // 小写字母计数
        } else if (c >= 'A' && c <= 'Z') {
            upperCount++;  // 大写字母计数
        }
    }

    string result = str;  // 初始化结果字符串为原始字符串
    if (lowerCount > upperCount) {
        // 小写字母多,转换为小写
        for (size_t i = 0; i < result.length(); ++i) {
            result[i] = tolower(result[i]);
        }
    } else if (upperCount > lowerCount) {
        // 大写字母多,转换为大写
        for (size_t i = 0; i < result.length(); ++i) {
            result[i] = toupper(result[i]);
        }
    }
    return result;  // 返回处理后的字符串
}

// 主逻辑函数:根据题目要求处理字符串并返回结果
string getResult() {
    vector<string> parts;  // 用于存储分割后的各个部分
    size_t pos = 0, prev = 0;

    // 使用 find 函数和 substr 分割字符串
    while ((pos = s.find("-", prev)) != string::npos) {
        parts.push_back(s.substr(prev, pos - prev));  // 将每个子部分添加到 parts
        prev = pos + 1;  // 更新 prev,准备查找下一个 "-" 后的部分
    }
    parts.push_back(s.substr(prev));  // 最后一部分直接添加到 parts

    string result = parts[0];  // 第一个部分直接添加到结果中,保持原样

    // 拼接剩下的部分,移除 "-",构造一个新的字符串
    string newStr;
    for (size_t i = 1; i < parts.size(); i++) {
        newStr += parts[i];
    }

    // 按照给定的 K 切分字符串,每 K 个字符为一组
    for (size_t i = 0; i < newStr.length(); i += k) {
        string subStr = newStr.substr(i, k);  // 获取每个子字符串
        result += "-" + convert(subStr);  // 处理子字符串,并添加到结果中
    }

    return result;  // 返回最终的结果
}

int main() {
    // 读取输入
    cin >> k;
    cin >> s;

    // 输出处理后的结果
    cout << getResult() << endl;

    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/145098941"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!