65. Valid Number #
Problem #
A valid number can be split up into these components (in order):
- A decimal number or an integer.
- (Optional) An ‘e’ or ‘E’, followed by an integer.
A decimal number can be split up into these components (in order):
- (Optional) A sign character (either ‘+’ or ‘-').
- One of the following formats:
- One or more digits, followed by a dot ‘.’.
- One or more digits, followed by a dot ‘.’, followed by one or more digits.
- A dot ‘.’, followed by one or more digits.
An integer can be split up into these components (in order):
- (Optional) A sign character (either ‘+’ or ‘-').
- 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:
Input: s = "0"
Output: true
Input: s = "e"
Output: false
Problem Summary #
Given a string S, determine whether the string is a valid numeric string according to the rules above.
Solution Approach #
- Use three variables to mark whether a digit has appeared, whether ‘.’ has appeared, and whether ‘e/E’ has appeared
- Traverse each element in the string from left to right
- If it is a digit, mark that a digit has appeared
- If it is ‘.’, then ‘.’ must not have appeared, and ‘e/E’ must not have appeared, before marking it
- If it is ‘e/E’, then ‘e/E’ must not have appeared, and a digit must have appeared before it, before marking it
- If it is ‘+/-’, then it must be the first character, or the previous character must be ‘e/E’, before marking it, and reset the flag indicating whether a digit has appeared
- When returning at the end, the string must contain at least one digit to avoid the following cases: s == ‘.’ or ‘e/E’ or ‘+/e’ and etc…
Code #
package leetcode
func isNumber(s string) bool {
numFlag, dotFlag, eFlag := false, false, false
for i := 0; i < len(s); i++ {
if '0' <= s[i] && s[i] <= '9' {
numFlag = true
} else if s[i] == '.' && !dotFlag && !eFlag {
dotFlag = true
} else if (s[i] == 'e' || s[i] == 'E') && !eFlag && numFlag {
eFlag = true
numFlag = false // reJudge integer after 'e' or 'E'
} else if (s[i] == '+' || s[i] == '-') && (i == 0 || s[i-1] == 'e' || s[i-1] == 'E') {
continue
} else {
return false
}
}
// avoid case: s == '.' or 'e/E' or '+/-' and etc...
// string s must have num
return numFlag
}