题目描述
给定一个非空字符串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@
个人代码解析
字符串的切分这里用到递归比较好解决。
function splitStr(sliceLen, data) {
let needProcessStr = data.substring(data.indexOf('-')).replace(/-/g, item => '');
let store = [];// 存储截取的字符
// 递归截取指定长度字符
sliceStr(sliceLen, needProcessStr, store);
return data.substring(0, data.indexOf('-') + 1) + store.join('-');
}
function sliceStr(len, input, store) {
if (input.length > len) {
let curStr = input.substring(0, len);
// 获取当前字符串中大小写字母数量
const lowStrCount = (curStr.match(/[a-z]/g) ?? []).length;
const upperStrCount = (curStr.match(/[A-Z]/g) ?? []).length;
if (lowStrCount !== upperStrCount) {
curStr = lowStrCount > upperStrCount ? curStr.toLowerCase() : curStr.toUpperCase();
}
store.push(curStr);
sliceStr(len, input.substring(len), store);
} else {
store.push(input);
}
}
console.log(splitStr(3, '12abc-abCABc-4aB@'));