给定一个非空字符串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@
我用了两个小时自己写出来的
var fn = function (k,s) {
let stringarray = s.split('-')
let newAArray = []
finallystring = ""
stringarray.forEach(i => {
if (i.length > k) {
let newStringARR = []
let count = k
while (i.length > k) {
newStringARR.push(i.slice(0, k))
i = i.slice(k)
count = count + k
}
newStringARR.push(i)
newAArray.push(...transformBorS(newStringARR))
}
else {
newAArray.push(...transformBorS([i]))
}
finallystring = newAArray.join("-")
})
function transformBorS(array) {
let TEMPArray = []
array.forEach(i => {
let small = 0, big = 0
i.split("").forEach(j => {
if (isLowerCase(j)) {
small++
} else {
big++
}
})
if (small > big) {
i = i.toLowerCase()
} else if (small < big) {
i = i.toUpperCase()
}
TEMPArray.push(i)
});
return TEMPArray
}
function isLowerCase(str) {
return /^[a-z]+$/.test(str);
}
function isUpperCase(str) {
return /^[A-Z]+$/.test(str);
}
console.log(finallystring)
return finallystring
}
大佬的
function fn2(K, S) {
let str = S.split("-")[0] + "-";
let str_ope = S.split("-").slice(1).join("");
for (let i = 0; i < Math.ceil(str_ope.length / K); i++) {
let substring = str_ope.substring(i * K, i * K + K);
let upper = 0, lower = 0;
for (let i = 0; i < substring.length; i++) {
substring[i] >= 'A' && substring[i] <= 'Z' ? upper++ : substring[i] >= 'a' && substring[i] <= 'z' ? lower++ : "";
}
substring = upper > lower ? substring.toUpperCase() : upper < lower ? substring.toLowerCase() : substring;
str += substring + "-";
}
console.log(str.slice(0, -1));
return str.slice(0, -1);
}
对比了一下,我在“其余的子串每K个字符组成新的子串”这里理解有误。我在保留了每个字串的基础上去拆分,而非全部合并统一拆分,导致代码复杂。