0065. Valid Number

65. Valid Number #

Problem #

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:

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
}


Calendar Jun 25, 2026
Edit Edit this page
Total visits:   You are visitor No.
中文