分割字符串
给定一个非空字符串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;
}