算法刷题第一天 字符串分割

71 阅读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@

我用了两个小时自己写出来的

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个字符组成新的子串”这里理解有误。我在保留了每个字串的基础上去拆分,而非全部合并统一拆分,导致代码复杂。