Лицензионный ключ Форматирование кода Challenge Leetcode - PullRequest
0 голосов
/ 11 сентября 2018

Это вызов :

Вам предоставляется лицензионный ключ, представленный в виде строки S, которая состоит только из буквенно-цифровых символов и тире.Строка разделена на N + 1 группы N штрихами.

Учитывая число 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 не будет превышать 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.В чем может быть ошибка?Как я могу сделать это более эффективным?

1 Ответ

0 голосов
/ 11 сентября 2018

Я считаю, что в программе нет ничего плохого, но она не настолько быстра, чтобы соответствовать временной сложности, ожидаемой с помощью leetcode. Я хотел бы предложить вам попробовать, удалить тире и преобразовать в верхний регистр затем добавьте черточки в каждое (kth + остаток) мест после оставшейся позиции.

Выполняйте эти операции в строителе строк вместо строки.

...