返回目录

题目描述

给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。
对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;
反之,如果它含有的大写字母比小写字母多,则将这个子串的所有小写字母转换为大写字母;大小写字母的数量相等时,不做转换。

输入描述

输入为两行,第一行为参数K,第二行为字符串S。

输出描述

输出转换后的字符串。

示例:

输入3
12abc-abCABc-4aB@
输出12abc-abc-ABC-4aB-@
说明子串为12abc、abCABc、4aB@,第一个子串保留,
后面的子串每3个字符一组为abC、ABc、4aB、@,
abC中小写字母较多,转换为abc,
ABc中大写字母较多,转换为ABC,
4aB中大小写字母都为1个,不做转换,
@中没有字母,连起来即12abc-abc-ABC-4aB-@

题目解析

此题应该就是考察字符串的操作能力的,只要熟练掌握字符串操作即可。

本题比较困惑的是,第一个子串是否要做大小写转换?看用例说明的意思,应该是不用做的。

下面代码中,我把大小写转换抽出成一个方法,考试时可以根据自行使用。

Python算法源码

def to_lower_case(s):
    return s.lower()

def to_upper_case(s):
    return s.upper()

def convert(s):
    lower_count = sum(1 for c in s if c.islower())
    upper_count = sum(1 for c in s if c.isupper())

    if lower_count > upper_count:
        return to_lower_case(s)
    elif lower_count < upper_count:
        return to_upper_case(s)
    else:
        return s

if __name__ == "__main__":
    k = int(input())  # 读取k的值
    s = input()  # 读取字符串s

    res = ""  # 用于存储结果的字符串
    new_str = ""  # 用于存储重新合并的子串

    # 如果第二行输入的开头是'-',则说明第一个字串是空串
    first = s[0] != '-'

    tokens = s.split("-")  # 使用'-'分割字符串s为子串
    for token in tokens:
        if first:
            # 第一个子串不做处理
            # 看用例说明,对应第一个子串是不需要做大小写转换的,但是也拿不准,考试时可以都试下
            res += token
            first = False
        else:
            # 剩余子串重新合并为一个新字符串,每k个字符一组
            new_str += token

    i = 0
    while i < len(new_str):
        # 新字符串每k个字符一组
        sub_str = new_str[i:i+k]

        # 子串中小写字母居多,则整体转为小写字母,大写字母居多,则整体转为大写字母
        res += "-" + convert(sub_str)
        i += k

    print(res)  # 打印结果字符串

C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 将字符串转换为小写
void toLowerCase(char *s) {
    int i = 0;
    while (s[i] != '\0') {
        if (s[i] >= 'A' && s[i] <= 'Z') {
            s[i] += 32;
        }
        i++;
    }
}

// 将字符串转换为大写
void toUpperCase(char *s) {
    int i = 0;
    while (s[i] != '\0') {
        if (s[i] >= 'a' && s[i] <= 'z') {
            s[i] -= 32;
        }
        i++;
    }
}

// 根据大小写比较结果转换字符串大小写
void convert(char *s) {
    int lowerCount = 0;
    int upperCount = 0;

    int i = 0;
    while (s[i] != '\0') {
        char c = s[i];

        if (c >= 'a' && c <= 'z') lowerCount++;
        else if (c >= 'A' && c <= 'Z') upperCount++;

        i++;
    }

    if (lowerCount > upperCount) {
        toLowerCase(s);
    } else if (lowerCount < upperCount) {
        toUpperCase(s);
    }
}

// 获取结果字符串
char *getResult(int k, char *s) {
    char *res = malloc(sizeof(char) * 1000); // 存储结果的字符串
    memset(res, '\0', 1000);

    char *arr[1000]; // 存储分割后的子串
    char *token = strtok(s, "-");
    int idx = 0;
    while (token != NULL) {
        arr[idx++] = token;
        token = strtok(NULL, "-");
    }

    // 第一个子串不做处理
    strcat(res, arr[0]);

    // 剩余子串重新合并为一个新字符串,每k个字符一组
    char newStr[1000] = {'\0'};
    for (int i = 1; i < idx; i++) {
        strcat(newStr, arr[i]);
    }

    // 每k个字符一组进行处理
    for (int i = 0; i < strlen(newStr); i += k) {
        char dest[k + 1]; // 存储每组字符
        strncpy(dest, newStr + i, k);
        dest[k] = '\0';

        // 根据大小写情况进行转换
        convert(dest);

        strcat(res, "-");
        strcat(res, dest);
    }

    return res;
}

int main() {
    int k;
    scanf("%d", &k); // 读取k的值

    char str[1000];
    scanf("%s", str); // 读取字符串s

    printf("%s\n", getResult(k, str)); // 打印结果字符串

    return 0;
}

Java算法源码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int k = scanner.nextInt(); // 读取k的值
        scanner.nextLine(); // 读取换行符

        String str = scanner.nextLine(); // 读取字符串s

        System.out.println(getResult(k, str)); // 打印结果字符串
    }

    public static String getResult(int k, String s) {
        String[] arr = s.split("-");

        StringBuilder res = new StringBuilder();
        // 第一个子串不做处理
        res.append(arr[0]);

        // 剩余子串重新合并为一个新字符串,每k个字符一组
        StringBuilder newStr = new StringBuilder();
        for (int i = 1; i < arr.length; i++) {
            newStr.append(arr[i]);
        }

        // 每k个字符一组进行处理
        for (int i = 0; i < newStr.length(); i += k) {
            String subStr = newStr.substring(i, Math.min(i + k, newStr.length()));
            // 根据大小写情况进行转换
            res.append("-").append(convert(subStr));
        }

        return res.toString();
    }

    public static String convert(String s) {
        int lowerCount = 0;
        int upperCount = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'a' && c <= 'z') lowerCount++;
            else if (c >= 'A' && c <= 'Z') upperCount++;
        }

        if (lowerCount > upperCount) return s.toLowerCase();
        else if (lowerCount < upperCount) return s.toUpperCase();
        else return s;
    }
}
最后修改:2024 年 04 月 04 日
如果觉得我的文章对你有用,请随意赞赏