Java 许可证密钥格式化代码挑战Leetcode

Java 许可证密钥格式化代码挑战Leetcode,java,string,performance,time,string-formatting,Java,String,Performance,Time,String Formatting,这就是挑战: 您将获得一个表示为字符串S的许可证密钥,该字符串仅由字母数字字符和破折号组成。字符串由N个破折号分隔为N+1个组。给定一个数字K,我们希望重新格式化字符串,使每个组正好包含K个字符,但第一个组可能短于K,但必须至少包含一个字符。此外,必须在两个组之间插入破折号,所有小写字母都应转换为大写。给定一个非空字符串S和一个数字K,根据上述规则格式化该字符串 例1: 输入:S=5F3Z-2e-9-w,K=4输出:5F3Z-2E9W说明:字符串S被分成两部分,每部分有4个字符。 请注意,这两个

这就是挑战:

您将获得一个表示为字符串S的许可证密钥,该字符串仅由字母数字字符和破折号组成。字符串由N个破折号分隔为N+1个组。给定一个数字K,我们希望重新格式化字符串,使每个组正好包含K个字符,但第一个组可能短于K,但必须至少包含一个字符。此外,必须在两个组之间插入破折号,所有小写字母都应转换为大写。给定一个非空字符串S和一个数字K,根据上述规则格式化该字符串

例1:

输入:S=5F3Z-2e-9-w,K=4输出:5F3Z-2E9W说明:字符串S被分成两部分,每部分有4个字符。 请注意,这两个额外的破折号不是必需的,可以删除

例2:

输入:S=2-5g-3-J,K=2输出:2-5g-3J说明:字符串S已分为三部分,除第一部分外,每个部分有2个字符,因为如上所述,第一部分可能较短

注:

1字符串S的长度不超过12000,K为正整数。2字符串S仅由字母数字字符a-z和/或a-z和/或0-9和破折号-组成。 3字符串S为非空

这是我的密码:

public static String licenseKeyFormatting(String S, int Key) {
    String cleaned = S.replaceAll("[\\-]", "").toUpperCase();
    String result = "";
    int currentPos = 0;

    //IF EVENLY SPLIT
    if ( (cleaned.length() % Key) == 0 ) {
        int numGroups = cleaned.length()/Key;

        for(int i = 0; i < numGroups; i++) {
            for (int k =0; k < Key; k++) {
                char currentLetter = cleaned.charAt(currentPos++);
                result = result + currentLetter;
            }

            if (i != (numGroups - 1)) {
                result = result + "-";
            }
        }
    }

    else {

        int remainder = cleaned.length() % Key;

        for (int i = 0; i < remainder; i++) {
            char currentLetter = cleaned.charAt(currentPos++);
            result = result + currentLetter;
        }

        if(remainder == cleaned.length()) {
            return result;
        }
        else {
            result = result + "-";
        }

        int numGroups =( (cleaned.length() - remainder)/Key);

        for (int i = 0; i < numGroups; i++) {
            for (int k =0; k < Key; k++) {
                char currentLetter = cleaned.charAt(currentPos++);
                result = result + currentLetter;
            }
            if (i != (numGroups - 1)) {
                result = result + "-";
            }
        }
    }

    //IF NOT EVENLY SPLIT
    return result;
}

当我在我的电脑上运行它时,它工作得非常好。当我在leetcode上运行它时,它会在输入44151个字符的字符串和1作为键时给我一个超过时间限制的错误。当我在IDE上运行相同的输入时,它可以正常工作,但在LeetCode上不行。可能是什么错误?我怎样才能提高效率

我相信程序中没有什么错误,但速度不够快,无法满足leetcode所期望的时间复杂性。我建议您可以尝试,删除破折号并转换为大写。然后在余数位置后的每个第k个+余数位置添加破折号


在stringbuilder而不是字符串中执行这些操作。

请提供质询,而不是链接到质询。我们真的很讨厌链接过时!你是说StringBuilder,对吗?虽然仍然比循环中的直接字符串连接更好,但较新的Java运行时引擎足够聪明,可以看出,如果只在一个方法中使用StringBuffer,则不需要进行同步,因此无论是使用StringBuilder还是StringBuffer,在这种情况下,我的习惯也是使用StringBuilder,不过,你的最后一句话可能是关键。如果没有StringBuilder,它会非常慢,因为它会创建大量长度高达40k的字符串。非常感谢@cs123-wc。请把答案写上去。