Leetcode[65] Valid Number

Bryan W.
2 min readMay 16, 2021

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:

At least one digit, followed by a dot '.'.

At least one digit, followed by a dot '.', followed by at least one digit.

A dot '.', followed by at least one digit.

An integer can be split up into these components (in order):

(Optional) A sign character (either '+' or '-').

At least one digit.

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.

Constriants

  • 1 <= s.length <= 20
  • s consists of only English letters (both uppercase and lowercase), digits (0-9), plus '+', minus '-', or dot '.'.

Difficulty

  • Level: Hard
  • Acceptance: 16.6%

Solution

Analysis

The hardest part for this problem would be setting up the regular expression. For starters, I identified that the + and - signs were optional and always in front. Hence, I added ^[\+\-]? in front. The rest of the expression is based on identifying the different cases:

  • \d+ — Case for numbers with only digits
  • \d+\.\d*(e[\+\-]?)?\d+ — Case for numbers such as 1.5e+6 , 1.e+7
  • \d\.\d* — Case for numbers such as 1.234
  • \d+(e[\+\-]?)?\d+ — Case for numbers such as 123e+7 , 12e7
  • \.\d+ — Case for numbers with digits after a .
  • \.\d+(e[\+\-]?)?\d+ — Case for numbers such as .123e-7 , .456e8

Finally, using the test method for RegExp, it will return a true or false value based on a match.

--

--

Bryan W.

I have a passion for coding | Salesforce Developer