65. Valid Number
given строку s, определите, является ли s валидным numberм.
На例, все следующие строки являются действительными числами: "2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789". В то время как следующие строки не являются валидными числами: "abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53".
Формально, валидное number определяется с использованием одного из следующих определений:
整数 с необязательным показателем степени.
Десятичное number с необязательным показателем степени.
整数 определяется необязательным знаком '-' или '+' за которым следуют цифры.
Десятичное number определяется необязательным знаком '-' или '+' и одним из следующих определений:
Цифры, за которыми следует точка '.'.
Цифры, за которыми следует точка '.', за которой следуют цифры.
Точка '.', за которой следуют цифры.
Показатель степени определяется с помощью обозначения показателя степени 'e' или 'E', за которым следует 整数.
Цифры определяются как одна или более цифр.
例:
Input: s = "0"
Output: true
C# 解法
照合済み/オリジナルpublic class Solution {
public bool IsNumber(string s) {
bool seenDigit = false;
bool seenExponent = false;
bool seenDot = false;
for (int i = 0; i < s.Length; i++) {
char curr = s[i];
if (Char.IsDigit(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;
}
}
C++ 解法
自動ドラフト、提出前に確認#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public bool IsNumber(string s) {
bool seenDigit = false;
bool seenExponent = false;
bool seenDot = false;
for (int i = 0; i < s.size(); i++) {
char curr = s[i];
if (Char.IsDigit(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;
}
}
Java 解法
照合済み/オリジナルclass Solution {
public boolean isNumber(String s) {
boolean seenDigit = false;
boolean seenExponent = false;
boolean seenDot = false;
for (int i = 0; i < s.length(); i++) {
char curr = s.charAt(i);
if (Character.isDigit(curr)) {
seenDigit = true;
} else if (curr == '+' || curr == '-') {
if (i > 0 && s.charAt(i - 1) != 'e' && s.charAt(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;
}
}
JavaScript 解法
照合済み/オリジナル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;
};
Python 解法
照合済み/オリジナルclass Solution:
def isNumber(self, s: str) -> bool:
seen_digit = seen_exponent = seen_dot = False
for i, c in enumerate(s):
if c.isdigit():
seen_digit = True
elif c in ["+", "-"]:
if i > 0 and s[i - 1] != "e" and s[i - 1] != "E":
return False
elif c in ["e", "E"]:
if seen_exponent or not seen_digit:
return False
seen_exponent = True
seen_digit = False
elif c == ".":
if seen_dot or seen_exponent:
return False
seen_dot = True
else:
return False
return seen_digit
Go 解法
照合済み/オリジナルfunc isNumber(s string) bool {
seenDigit := false
seenExponent := false
seenDot := false
for i := 0; i < len(s); i++ {
curr := s[i]
if '0' <= curr && curr <= '9' {
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
}
Algorithm
1️⃣
Объявите три переменные: seenDigit, seenExponent и seenDot, установив их все в false. Перебирайте символы 入力ной строки. Если символ является цифрой, установите seenDigit в true.
2️⃣
Если символ является знаком (+ или -), проверьте, является ли он первым символом ввода или предшествует ли он показателю степени (экспоненте). Если нет, return false. Если символ является экспонентой (e или E), сначала проверьте, была ли уже видна экспонента или еще не было увидено ни одной цифры. Если что-то из этого верно, return false. В противном случае установите seenExponent в true и сбросьте seenDigit, потому что после экспоненты должно следовать новое 整数.
3️⃣
Если символ — точка (.), проверьте, были ли уже видны точка или экспонента. Если да, return false. Иначе установите seenDot в true. Если символ чему-то иначе, return false. В конце return значение seenDigit, потому что, на例, ввод вида "21e" должен быть признан недействительным, если после e не следуют цифры.
😎
Vacancies for this task
有効な求人 with overlapping task tags are 表示.