1. 字符串分割

198 阅读2分钟

分割字符串

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

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

输出描述: 输出转换后的字符串。

示例1

输入
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-@

示例2

输入
12   
12abc-abCABc-4aB@

输出
12abc-abCABc4aB@

说明
子串为12abc、abCABc、4aB@,第一个子串保留,后面的子串每12个字符一组为abCABc4aB@,
这个子串中大小写字母都为4个,不做转换,连起来即12abc-abCABc4aB@

思路:直接暴力解法即可,额外开辟了空间

#include <iostream>
#include <string>

//处理字符串
inline void  process(std::string& str)
{
    int len = str.size();
    int low = 0, up = 0;
    for (int i = 0; i < len; i++) {
        if (str[i] >= 'a' && str[i] <= 'z')low++;
        if (str[i] >= 'A' && str[i] <= 'Z')up++;
    }
    if (low > up) {
        for (int i = 0; i < len; i++) {
            if (str[i] >= 'A' && str[i] <= 'Z') {
                str[i] -= 'A' - 'a';
            }
        }
    }
    else if (low < up) {
        for (int i = 0; i < len; i++) {
            if (str[i] >= 'a' && str[i] <= 'z') {
                str[i] -= 'a' - 'A';
            }
        }
    }
}

int main()
{
    int k = 0;
    std::cin >> k;
    std::string str;
    std::cin >> str;
    std::string result;
    int first = str.find_first_of('-');
    result += str.substr(0, first);
    std::string temp;
    for (size_t i = first; i < str.size(); i++)
    {
        if (str[i] == '-') continue;
        temp += str[i];
        if (temp.size() == k) {
            process(temp);
            result += '-' + temp;
            temp = "";
        }
    }
    if(temp != "") {
        process(temp);
        result += '-' + temp;
    }
    std::cout << result << std::endl;
    return 0;
}