Сложность: hard
Учитывая строку s, определите, является ли s валидным числом.
Формально, валидное число определяется с использованием одного из следующих определений:
Целое число с необязательным показателем степени.
Десятичное число с необязательным показателем степени.
Целое число определяется необязательным знаком '-' или '+' за которым следуют цифры.
Пример:
Input: s = "0"
Output: true
👨💻 Алгоритм:
1️⃣Объявите три переменные: seenDigit, seenExponent и seenDot, установив их все в false. Перебирайте символы входной строки. Если символ является цифрой, установите seenDigit в true.
2️⃣Если символ является знаком (+ или -), проверьте, является ли он первым символом ввода или предшествует ли он показателю степени (экспоненте). Если нет, верните false. Если символ является экспонентой (e или E), сначала проверьте, была ли уже видна экспонента или еще не было увидено ни одной цифры. Если что-то из этого верно, верните false. В противном случае установите seenExponent в true и сбросьте seenDigit, потому что после экспоненты должно следовать новое целое число.
3️⃣Если символ — точка (.), проверьте, были ли уже видны точка или экспонента. Если да, верните false. Иначе установите seenDot в true. Если символ чему-то иначе, верните false. В конце верните значение seenDigit, потому что, например, ввод вида "21e" должен быть признан недействительным, если после e не следуют цифры.
😎 Решение:
var isNumber = function (s) {
var seenDigit = false;
var seenExponent = false;
var seenDot = false;
for (var i = 0; i < s.length; i++) {
var curr = s[i];
if (!isNaN(curr)) {
seenDigit = true;
} else if (curr == "+" || curr == "-") {
if (i > 0 && s[i - 1] != "e" && s[i - 1] != "E") {
return false;
}
} else if (curr == "e" || curr == "E") {
if (seenExponent || !seenDigit) {
return false;
}
seenExponent = true;
seenDigit = false;
} else if (curr == ".") {
if (seenDot || seenExponent) {
return false;
}
seenDot = true;
} else {
return false;
}
}
return seenDigit;
};Ставь 👍 и забирай 📚 Базу знаний