A valid number can be split up into these components (in order):
1. A decimal number or an integer.
2. (Optional) An 'e' or 'E', followed by an integer.
A decimal number can be split up into these components (in order):
1. (Optional) A sign character (either '+' or '-').
2. One of the following formats:
1. One or more digits, followed by a dot '.'.
2. One or more digits, followed by a dot '.', followed by one or more digits.
3. A dot '.', followed by one or more digits.
An integer can be split up into these components (in order):
1. (Optional) A sign character (either '+' or '-').
2. One or more digits.
For example, all the following are valid numbers: ["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"], while the following are not valid numbers: ["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"].
Given a string s, return true if s is a valid number.
Example 1:
Input: s = "0"
Output: true
Example 2:
Input: s = "e"
Output: false
Example 3:
Input: s = "."
Output: false
Constraints:
- 1 <= s.length <= 20
- s consists of only English letters (both uppercase and lowercase), digits (0-9), plus '+', minus '-', or dot '.'.
Code :
var isNumber = function(s) {
// 문자열 양 끝의 공백 제거
s = s.trim();
// 숫자, 소수점, 지수 기호 등을 추적하기 위한 변수들 초기화
let seenNumber = false; // 숫자를 보았는지 여부
let seenDot = false; // 소수점을 보았는지 여부
let seenE = false; // 지수(E 또는 e)를 보았는지 여부
let seenNumberAfterE = true; // 지수 이후 숫자를 본 상태인지 여부
for (let i = 0; i < s.length; i++) {
if ("0123456789".includes(s[i])) {
// 현재 문자가 숫자인 경우
seenNumber = true;
seenNumberAfterE = true;
} else if (s[i] === ".") {
// 현재 문자가 소수점인 경우
if (seenDot || seenE) {
// 이미 소수점이나 지수를 본 경우, 유효하지 않음
return false;
}
seenDot = true;
} else if (s[i] === "e" || s[i] === "E") {
// 현재 문자가 지수 기호인 경우
if (seenE || !seenNumber) {
// 이미 지수를 본 경우 또는 숫자를 아직 보지 않은 경우, 유효하지 않음
return false;
}
seenE = true;
seenNumberAfterE = false;
} else if (s[i] === "-" || s[i] === "+") {
// 현재 문자가 부호 기호인 경우
if (i !== 0 && s[i - 1] !== "e" && s[i - 1] !== "E") {
// 부호 기호는 첫 문자이거나 바로 전 문자가 지수 기호가 아닌 경우, 유효하지 않음
return false;
}
} else {
// 숫자, 소수점, 지수 기호, 부호 기호가 아닌 문자가 포함되면 유효하지 않음
return false;
}
}
// 숫자가 하나 이상 있어야 하며, 지수 이후에도 숫자가 있어야 함
return seenNumber && seenNumberAfterE;
};
Solutions Code :
var isNumber = function(S) {
// 지수, 부호, 숫자, 소수점 여부를 나타내는 변수 초기화
let exp = false, sign = false, num = false, dec = false;
// 문자열을 순회하며 각 문자에 대한 조건을 확인
for (let c of S) {
if (c >= '0' && c <= '9') {
// 숫자인 경우
num = true;
} else if (c === 'e' || c === 'E') {
// 지수 표시인 경우
if (exp || !num) return false;
else exp = true, sign = false, num = false, dec = false;
} else if (c === '+' || c === '-') {
// 부호인 경우
if (sign || num || dec) return false;
else sign = true;
} else if (c === '.') {
// 소수점인 경우
if (dec || exp) return false;
else dec = true;
} else {
// 숫자, 지수, 부호, 소수점 이외의 문자인 경우
return false;
}
}
// 숫자로 해석 가능한 경우 true 반환
return num;
};
출처 : https://leetcode.com/problemset/all/
'LeetCode' 카테고리의 다른 글
[LeetCode] 67. Add Binary (0) | 2024.01.30 |
---|---|
[LeetCode] 66. Plus One (2) | 2024.01.29 |
[LeetCode] 64. Minimum Path Sum (0) | 2024.01.14 |
[LeetCode] 63. Unique Paths II (0) | 2024.01.12 |
[LeetCode] 62. Unique Paths (0) | 2024.01.12 |