Description
Given a string s, return whether s is a valid number.
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".
Formally, a valid number is defined using one of the following definitions:
- An integer number followed by an optional exponent.
- A decimal number followed by an optional exponent.
An integer number is defined with an optional sign '-' or '+' followed by digits.
A decimal number is defined with an optional sign '-' or '+' followed by one of the following definitions:
- Digits followed by a dot
'.'. - Digits followed by a dot
'.'followed by digits. - A dot
'.'followed by digits.
An exponent is defined with an exponent notation 'e' or 'E' followed by an integer number.
The digits are defined as one or more digits.
Example 1:
Input: s = "0"
Output: true
Example 2:
Input: s = "e"
Output: false
Example 3:
Input: s = "."
Output: false
Constraints:
1 <= s.length <= 20sconsists of only English letters (both uppercase and lowercase), digits (0-9), plus'+', minus'-', or dot'.'.
Solutions
Solution 1: Case Discussion
First, we check if the string starts with a positive or negative sign. If it does, we move the pointer i one step forward. If the pointer i has reached the end of the string at this point, it means the string only contains a positive or negative sign, so we return false.
If the character pointed to by the current pointer i is a decimal point, and there is no number after the decimal point, or if there is an e or E after the decimal point, we return false.
Next, we use two variables dot and e to record the number of decimal points and e or E respectively.
We use pointer j to point to the current character:
- If the current character is a decimal point, and a decimal point or
eorEhas appeared before, returnfalse. Otherwise, we increment dot by one; - If the current character is
eorE, andeorEhas appeared before, or if the current character is at the beginning or end of the string, returnfalse. Otherwise, we increment e by one; then check if the next character is a positive or negative sign, if it is, move the pointer j one step forward. If the pointer j has reached the end of the string at this point, returnfalse; - If the current character is not a number, return
false.
After traversing the string, return true.
The time complexity is O(n), and the space complexity is O(1). Here, n is the length of the string.
class Solution: def isNumber(self, s: str) -> bool: n = len(s) i = 0 if s[i] in '+-': i += 1 if i == n: return False if s[i] == '.' and (i + 1 == n or s[i + 1] in 'eE'): return False dot = e = 0 j = i while j < n: if s[j] == '.': if e or dot: return False dot += 1 elif s[j] in 'eE': if e or j == i or j == n - 1: return False e += 1 if s[j + 1] in '+-': j += 1 if j == n - 1: return False elif not s[j].isnumeric(): return False j += 1 return True(code-box)
