Вот ваш код с некоторыми настройками форматирования для удобства чтения:
function intenseString(str) {
if (str.slice(-3) !== '!!!') {
return false;
}
if (str.slice(str.indexOf('!'))) {
return false;
}
if (str.slice(-3) === '!!!') {
return true;
}
}
Можете ли вы привести несколько примеров ввода, которые возвращают true
?Я не думаю, что это когда-либо вернет true
, потому что второе выражение if
говорит: "верните false, если в строке есть какие-либо !
, что подразумевается при пропуске первого if
.
Я полагаю, что вы хотели добавить + 1
: if (str.slice(str.indexOf('!') + 1)) return false
, который говорит: "верните false, если есть какие-либо !
, которые не являются последним символом в строке", что все равно не будет работать: первыйОператор if
вернет false, если строка не заканчивается !!!
, что означает, что наименьшая строка, которая попадет во второй оператор if
, будет !!!
, и после первого !
всегда будут символы.
Другой потенциальной попыткой будет проверка только строки перед последними тремя символами if (str.slice(0, -3).slice(str.indexOf('!') + 1)) return false
, которая почти работает, за исключением строк, содержащих более 4 !
в самом конце ... (например, * 1023).*).
Я не вижу простого способа (без регулярного выражения проверить, что оставшиеся символы только !
), чтобы второй оператор if
работал без зацикливания строки.
Обратите внимание, что ваш окончательный if
не требуется.Первые два проверяют наличие ошибок, и если они проходят через них, это должна быть интенсивная строка.Также строка должна заканчиваться на !!!
, если она прошла после первого if
.
Вот потенциальное решение, которое проходит через каждый символ в строке, кроме последних 4,и возвращает false
, если когда-либо !
сопровождается чем-то, что не !
.
function intenseString(str) {
if (!str.endsWith('!!!')) {
return false;
}
for (let i = 0; i < str.length - 4; i++) {
if (str.charAt(i) === '!' && str.charAt(i + 1) !== ('!')) {
return false;
}
}
return true;
}