OD统一考试(C卷)分值: 100分题解: Java / Python / C++题目描述给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。输入描述输入为两行,第一行为参数K,第二行为字符串S。输出描述输出转换后的字符串示例1输入:312abc-abcABC-4aB@输出:12abc-abc-ABC-4aB-@说明:子串为12abc、abCABc、4aB@,第一个子串保留,后面的子串每3个字符一组为abC、ABc、4aB、@,abC中小写字母较多,转换为abc,ABc中大写字母较多,转换为ABC,4aB中大小写字母都为1个,不做转换,@中没有字母,连起来即12abc-abc-ABC-4aB-@示例2输入:1212abc-abCABc-4aB@输出:12abc-abCABc4aB@说明:子串为12abc、abCABc、4aB@,第一个子串保留,后面的子串每12个字符一组为abCABc4aB@,这个子串中大小写字母都为4个,不做转换,连起来即12abc-abCABc4aB@题解这个题目涉及字符串的处理,主要是分割字符串和对子串进行处理。以下是关键部分的解释:解题思路找到第一个 '-' 的位置,确定第一个子串的边界;对后续的子串进行处理,每次处理 k 个字符;统计子串中小写字母和大写字母的数量,进行大小写转换。Javaimport java.util.Scanner;/** * @author code5bug */public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int k = scanner.nextInt();        String s = scanner.next();        int pos = s.indexOf('-');        if (pos == -1) { // 不存在 '-'            System.out.println(s);            return;        }        StringBuilder result = new StringBuilder();        result.append(s.substring(0, pos)); // 第一个子串不变        for (int i = pos + 1; i < s.length(); ) {            StringBuilder subBuilder = new StringBuilder();            while (i < s.length() && subBuilder.length() < k) {                char c = s.charAt(i++);                if (c != '-') subBuilder.append(c);            }            // 小写字符个数,大写字符个数            int lcnt = 0, ucnt = 0;            for (char c : subBuilder.toString().toCharArray()) {                if (c >= 'a' && c <= 'z') lcnt++;                if (c >= 'A' && c <= 'Z') ucnt++;            }            // 子串大小写转换            String subString = subBuilder.toString();            if (lcnt < ucnt) {                subString = subString.toLowerCase();            } else if (lcnt > ucnt) {                subString = subString.toUpperCase();            }            result.append("-").append(subString);        }        System.out.println(result);    }}Pythondef solve(k: int, s: str) -> str:    pos = s.find("-")    if pos == -1:  # 不存在 '-'        return s    sub_list = []    sub_list.append(s[:pos])  # 第一个子串不变    # 将 s 中的 '-' 都去掉    s1 = ''.join([s[i] for i in range(pos + 1, len(s)) if s[i] != '-'])    for i in range(0, len(s1), k):        if i + k <= len(s1):            sub = s1[i: i+k]        else:            sub = s1[i:]        # 小写字符个数, 大写字符个数        lcnt, ucnt = 0, 0        for ch in sub:            if 'a' <= ch <= 'z':                lcnt += 1            if 'A' <= ch <= 'Z':                ucnt += 1        # 子串大小写转换        if lcnt > ucnt:            sub = sub.lower()        elif ucnt > lcnt:            sub = sub.upper()        sub_list.append(sub)    return '-'.join(sub_list)k = int(input())s = input()print(solve(k, s))C++#include <bits/stdc++.h>using namespace std;int main(){    size_t k;    string s;    cin >> k >> s;    size_t pos = s.find('-');    if (pos == string::npos) {   // 不存在 '-'        cout << s << endl;        return 0;    }    string result;    result.append(s.substr(0, pos));   //  第一个子串不变    for (size_t i = pos + 1; i < s.length();) {        string sub;        while (i < s.length() && sub.length() < k) {            char c = s[i++];            if (c != '-') sub.push_back(c);        }        // 小写字符个数, 大写字符个数        int lcnt = 0, ucnt = 0;        for (char c : sub) {            if (c >= 'a' && c <= 'z') lcnt++;            if (c >= 'A' && c <= 'Z') ucnt++;        }        // 子串大小写转换        if (lcnt < ucnt) {            transform(sub.begin(), sub.end(), sub.begin(), ::toupper);        }        if (lcnt > ucnt) {            transform(sub.begin(), sub.end(), sub.begin(), ::tolower);        }        result.append("-");        result.append(sub);    }    cout << result << endl;    return 0;}🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏
点赞 3
评论 0
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务