본문 바로가기
LeetCode

[LeetCode] 65. Valid Number

by JungSeung 2024. 1. 23.
728x90

https://leetcode.com/

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/

 

Problems - LeetCode

Boost your coding interview skills and confidence by practicing real interview questions with LeetCode. Our platform offers a range of essential problems for practice, as well as the latest questions being asked by top-tier companies.

leetcode.com

 

728x90

'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