Возникли проблемы с повторной индексацией массива после зацикливания конца массива при добавлении символов на место - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь решить этот конкретный вопрос об алгоритме:

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

Учитывая число K, мы хотели бы переформатировать строки так, чтобы каждая группа содержала ровно K символов, за исключением первой группы, которая может быть короче, чем K, но все равно должен содержать хотя бы один символ. Кроме того, между двумя группами должен быть вставлен символ da sh, а все строчные буквы должны быть преобразованы в верхний регистр.

Если задана непустая строка S и число K, отформатируйте строку в соответствии с описанными правилами выше.

Пример 1: Вход: S = "5F3Z-2e-9-w", K = 4

Выход: "5F3Z-2E9W"

Объяснение: The Строка S была разбита на две части, каждая часть имеет 4 символа. Обратите внимание, что две дополнительные тире не нужны и могут быть удалены. Пример 2: Ввод: S = "2-5g-3-J", K = 2

Выход: "2-5G-3J"

Объяснение: Строка S разбита на три части, каждая часть имеет 2 символа, кроме первой, так как она может быть короче, как указано выше. Примечание. Длина строки S не будет превышать 12 000, а K - положительное целое число. Строка S состоит только из буквенно-цифровых символов (az и / или AZ и / или 0-9) и тире (-). Строка S не пуста.

Я написал следующий код:

const licenseKeyFormatting = (S, K) => {
    //convert to array, remove special characters, and capitalize
    let s = [...S.replace(/\W/g, '').toUpperCase()]
    let pos = 1
    //from end of array add '-' for every K
    for (let i = s.length - 1; i > 0; i--) {
        if (pos === K) {
            s.splice(i, 0, '-')
            pos = 1
            i-- //re-index bc adding to the array
        }
        pos++
    }
    return s
}


console.log(licenseKeyFormatting("5F3Z-2e-9-w", 4)) //5F3Z-2E9W
console.log(licenseKeyFormatting("2-5g-3-J", 2)) //2-5G-3J
console.log(licenseKeyFormatting("a-a-a-a-", 1)) // this test case fails should be A-A-A-A, I am getting AAA-A

Я почти уверен, что недостаток в моих логиках c связан с переиндексацией, но Я не могу понять, как решить эту проблему.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы не должны изменять индекс. Использование splice для вставки элемента отодвигает другие элементы назад, однако, поскольку вы выполняете итерацию от начала до конца, это не имеет значения. Вы уже обработали сдвинутые элементы.

Другая проблема - установка pos = 1 в l oop. За этим непосредственно следует pos++. Поэтому, когда pos достигает K, значение pos будет сброшено на 2 в конце l oop. Либо установите pos = 0 (в l oop), чтобы он заканчивался на 1, либо переместите pos++ в секцию else.

const licenseKeyFormatting = (S, K) => {
    //convert to array, remove special characters, and capitalize
    let s = [...S.replace(/\W/g, '').toUpperCase()]
    let pos = 1
    //from end of array add '-' for every K
    for (let i = s.length - 1; i > 0; i--) {
        if (pos === K) {
            s.splice(i, 0, '-')
            pos = 0
        }
        pos++
    }
    return s.join("") // <- added join for cleaner console output
}


console.log(licenseKeyFormatting("5F3Z-2e-9-w", 4)) //5F3Z-2E9W
console.log(licenseKeyFormatting("2-5g-3-J", 2)) //2-5G-3J
console.log(licenseKeyFormatting("a-a-a-a-", 1)) // this test case fails should be A-A-A-A, I am getting AAA-A
1 голос
/ 02 мая 2020

мой путь ....

function licenseKeyFormatting( S, K )
  {
  let arr = [...S.replace(/\W/g, '').toUpperCase()]
    , p   = 0
    ;
  for (let i=arr.length;i--;)
    {
    p = ++p % K                     // p = (p+1) % K
    if (!p&&i) arr.splice(i,0,'-')  // if p===0 and i>0
    }
  return arr.join('')
  }


console.log(licenseKeyFormatting("5F3Z-2e-9-w", 4)) // 5F3Z-2E9W
console.log(licenseKeyFormatting("2-5g-3-J", 2))   //  2-5G-3J
console.log(licenseKeyFormatting("a-a-a-a-", 1))  //   A-A-A-A  

ИЛИ: (более просто)

function licenseKeyFormatting( S, K )
  {
  let arr = [...S.replace(/\W/g, '').toUpperCase()];
  for (let p=arr.length-K;p>0;p-=K) arr.splice(p,0,'-');
  return arr.join('');
  }


console.log( licenseKeyFormatting("5F3Z-2e-9-w", 4)) // 5F3Z-2E9W
console.log( licenseKeyFormatting("2-5g-3-J", 2))   //  2-5G-3J
console.log( licenseKeyFormatting("a-a-a-a-", 1))  //   A-A-A-A
...