这是挑战:
为您提供了一个许可证密钥,该许可证密钥表示为字符串S,仅包含字母数字字符和破折号。该字符串由N个破折号分隔为N + 1个组。
在给定数字K的情况下,我们希望重新格式化字符串,使每个组恰好包含K个字符,但第一个组可以短于K,但仍必须至少包含一个字符。此外,两组之间必须插入破折号,并且所有小写字母都应转换为大写字母。
给出非空字符串S和数字K,然后根据上述规则设置字符串的格式。
示例1:
输入:S =“ 5F3Z-2e-9-w”,K = 4 输出:“ 5F3Z-2E9W”
< strong>说明:字符串S已分为两部分,每个部分有4个字符。 请注意,不需要多余的两个破折号,可以将其删除。
示例2:
输入:S =“ 2-5g-3-J”,K = 2 输出:“ 2-5G-3J”
说明:字符串S已分为三部分,除第一部分外,每个部分都有2个字符,如上所述,它可能会更短。
注意:
1)字符串S的长度将不超过12,000,并且K为正整数。
2)字符串S仅由字母数字字符(az和/或AZ和/或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上运行。可能是什么错误?我该如何提高效率?
答案 0 :(得分:0)
我相信程序没有错,但是它不够快,无法满足leetcode预期的时间复杂性。我建议您可以尝试删除破折号并转换为大写字母。然后在余数位置之后的每个(kth +余数)位置添加破折号。
在stringbuilder中而不是在string中执行这些操作。