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 trueifsis a valid number.
Example 1:
**Input:** s = "0"
**Output:** true
Example 2:
**Input:** s = "e"
**Output:** false
Example 3:
**Input:** s = "."
**Output:** false
Example 4:
**Input:** s = ".1"
**Output:** true
Constraints:
1 <= s.length <= 20
s consists of only English letters (both uppercase and lowercase), digits (0-9), plus '+', minus '-', or dot '.'.
ac
The key is to understand the rules
classSolution {publicbooleanisNumber(String s) {// edge casesif (s ==null) returnfalse; s =s.trim();if (s.length() ==0) returnfalse;boolean signSeen =false;boolean dotSeen =false;boolean eSeen =false;boolean numberSeen =false;int n =s.length();for (int i =0; i < n; i++) {char c =s.charAt(i);if (!isValid(c)) returnfalse; // not a valid char// sign: first, right after e/E, not last,twiceif (c =='+'|| c =='-') {if (i >0&& (s.charAt(i-1) !='e'&&s.charAt(i-1) !='E') || i == n -1)returnfalse; signSeen =true; }// dot: once, not after e, last with numberSeenif (c =='.') {if (dotSeen || eSeen || i == n -1&&!numberSeen) returnfalse; dotSeen =true; }// e/E: after number, once, not lastif (c =='e'|| c =='E') {if (!numberSeen || eSeen || i == n -1) returnfalse; eSeen =true; }// numbersif (c >='0'&& c <='9') { numberSeen =true; } }returntrue; }privatebooleanisValid(char c) {if (c =='.'|| c =='+'|| c =='-'|| c =='e'|| c =='E'|| c >='0'&& c <='9')returntrue;returnfalse; }}/*trim()special char: . e +- numbersignSeen, first, after e, not lastdotSeen, once, not last, not after eeSeen, after number, once, not lastnumberSeen*/