Удалить последний символ из строки, если это "!" Использование For-Loop - JavaScript - PullRequest
0 голосов
/ 09 апреля 2019

У меня

function remove(s) {

    for (i = 0; i < s.length; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }
        else {
            return s;
        }
    }
  return s;
}

И это проходит 105 тестов, но не удается 1 на кодовых войнах .

Тест, который он терпит неудачу:

Expected: '\'isl\'', instead got: '\'isl!\'', когда (s) равен "isl!!!!!"

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

Это должно быть удаление последнего символа в строке всякий раз, когда он !:

if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }

Я также пытался:

s = s.replace("!", "");

Но тот же результат.Есть идеи?

Ответы [ 5 ]

3 голосов
/ 09 апреля 2019

Потому что вы увеличиваете i и проверяете i < s.length в каждом цикле.В какой-то момент вы удаляете ! (таким образом сокращая строку), и i равно s.length, и вы никогда не проверяете последний символ.

Нет никакой причины для i.(Или цикл for, но если это было требованием в задаче ...)

Если вы пройдете через него с помощью отладчика, вы увидите проблему.Эта версия с использованием console.log также показывает проблему:

function remove(s) {

    for (i = 0; i < s.length; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
            console.log(`i = ${i}, s = '${s}', s.substring(i) = '${s.substring(i)}'`);
        }
        else {
            console.log(`returning '${s}'`);
            return s;
        }
    }
  console.log(`returning '${s}' at end, because ${i} >= ${s.length}`);
  return s;
}
remove("isl!!!!!");
.as-console-wrapper {
  max-height: 100% !important;
}
1 голос
/ 09 апреля 2019

Вы можете создать рекурсивную функцию и проверить, является ли последний символ, используя CharAt, если это !.Если это так, то снова вызовите ту же функцию, но с новой строкой, которая создается после удаления последнего !

. Не уверен, зачем нужен for, если нужен последний символ

* 1008.*
function remove(str) {

  let getLastChar = str.charAt(str.length - 1);
  if (getLastChar === '!') {
    return remove(str.substring(0, str.length - 1))
  } else {
    return str;
  }

}

console.log(remove("isl!!!!!"));

Вот результат кодовых войн

Вот codewars результат

1 голос
/ 09 апреля 2019

Вы можете сделать это без использования цикла for.

const stringRemover (str) => {
  if (str[str.length-1] === "!") {
    return str.slice(0,str.length-1);
  } else {
    return str;
  }
}
0 голосов
/ 09 апреля 2019

@ TJ Crowder указал мне правильное направление, но он не дал ответа, который следовал бы моей первоначальной логике (в данном случае я хотел использовать цикл for).

Вывод ключачто s = s.replace("!", ""); будет работать, когда i-- и s = s.replace(/!+$/g, '') будет работать, когда i++.Потому что, насколько я понимаю, метод replace () заменяет только первое вхождение строки, поэтому нам нужно i--, чтобы заставить цикл повторяться в обратном направлении по строке, убедившись, чтокаждый случай "!" заменяется.

Т.е. это будет работать:

function remove(s) {

    for (i = 0; i < s.length; i--) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.replace("!", '')
        }
        else {
            return s;
        }
    }
    return s;
}

И это также будет работать:

function remove(s) {

    for (i = 0; i < s.length; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.replace(/!+$/g, '');
        }
        else {
            return s;
        }
    }
    return s;
}
0 голосов
/ 09 апреля 2019

Как и в предыдущем ответе, i < s.length проверяется на каждой итерации в цикле for.Попробуйте это:

function remove(s) {

    let a = s.length;

    for (i = 0; i < a; i++) {

        let lastChar = s.slice(-1);

        if (lastChar === "!") {
            s = s.substring(0, s.length - 1);
        }
        else {
            return s;
        }
    }
  return s;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...