Difficulty: Hard
More:【目录】LeetCode Java实现
Description
Validate if a given string can be interpreted as a decimal number.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
" -90e3 "
=> true
" 1e"
=> false
"e3"
=> false
" 6e-1"
=> true
" 99e2.5 "
=> false
"53.5e93"
=> true
" --6 "
=> false
"-+3"
=> false
"95a54e53"
=> false
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:
- Numbers 0-9
- Exponent - "e" or "E"
- Positive/negative sign - "+"/"-"
- Decimal point - "."
Of course, the context of these characters also matters in the input.
Intuition
Method1: A valid number is in the form of A.B e/E A (A: integer, B: unsigned integer), so it is helpful to break the problem down to several components that can be solved individually. Detailed solution refer to: 表示数值的字符串
Method2: Use some flags(eSeen, pointSeen, isNum) while scan each character in the String. The solution is shown below.
Solution
public boolean isNumber(String s) { if(s==null || s.length()<=0) return false; s=s.trim(); boolean isNum=false; boolean pointSeen=false; boolean eSeen=false; for(int i=0;i<s.length();i++){ if(s.charAt(i)=='+'||s.charAt(i)=='-'){ if(i!=0 && s.charAt(i-1)!='e' && s.charAt(i-1)!='E') return false; }else if(Character.isDigit(s.charAt(i))){ isNum=true; }else if(s.charAt(i)=='.'){ if(eSeen || pointSeen) return false; pointSeen=true; }else if(s.charAt(i)=='e' || s.charAt(i)=='E' ){ if(eSeen || !isNum) return false; eSeen=true; isNum=false; }else return false; } return isNum; }
Complexity
Time complexity : O(n)
Space complexity : O(1)
What I've learned
1. Ought to make the best of flags. Learn to use flags well.
More:【目录】LeetCode Java实现