[LeetCode] 65. Valid Number 验证数字
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"
- Positive/negative sign - "+"/"-"
- Decimal point - "."
Of course, the context of these characters also matters in the input.
Update (2015-02-10):
The signature of the C++
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
这道题需要考虑的情况非常多,OJ的成功率很低,估计面试不会出此题的。
Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public boolean isNumber(String s) { s = s.trim(); boolean pointSeen = false ; boolean eSeen = false ; boolean numberSeen = false ; boolean numberAfterE = true ; for ( int i= 0 ; i<s.length(); i++) { if ( '0' <= s.charAt(i) && s.charAt(i) <= '9' ) { numberSeen = true ; numberAfterE = true ; } else if (s.charAt(i) == '.' ) { if (eSeen || pointSeen) { return false ; } pointSeen = true ; } else if (s.charAt(i) == 'e' ) { if (eSeen || !numberSeen) { return false ; } numberAfterE = false ; eSeen = true ; } else if (s.charAt(i) == '-' || s.charAt(i) == '+' ) { if (i != 0 && s.charAt(i- 1 ) != 'e' ) { return false ; } } else { return false ; } } return numberSeen && numberAfterE; } |
Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class Solution: # @param s, a string # @return a boolean # @finite automation def isNumber( self , s): INVALID = 0 ; SPACE = 1 ; SIGN = 2 ; DIGIT = 3 ; DOT = 4 ; EXPONENT = 5 ; #0invalid,1space,2sign,3digit,4dot,5exponent,6num_inputs transitionTable = [[ - 1 , 0 , 3 , 1 , 2 , - 1 ], #0 no input or just spaces [ - 1 , 8 , - 1 , 1 , 4 , 5 ], #1 input is digits [ - 1 , - 1 , - 1 , 4 , - 1 , - 1 ], #2 no digits in front just Dot [ - 1 , - 1 , - 1 , 1 , 2 , - 1 ], #3 sign [ - 1 , 8 , - 1 , 4 , - 1 , 5 ], #4 digits and dot in front [ - 1 , - 1 , 6 , 7 , - 1 , - 1 ], #5 input 'e' or 'E' [ - 1 , - 1 , - 1 , 7 , - 1 , - 1 ], #6 after 'e' input sign [ - 1 , 8 , - 1 , 7 , - 1 , - 1 ], #7 after 'e' input digits [ - 1 , 8 , - 1 , - 1 , - 1 , - 1 ]] #8 after valid input input space state = 0 ; i = 0 while i< len (s): inputtype = INVALID if s[i] = = ' ' : inputtype = SPACE elif s[i] = = '-' or s[i] = = '+' : inputtype = SIGN elif s[i] in '0123456789' : inputtype = DIGIT elif s[i] = = '.' : inputtype = DOT elif s[i] = = 'e' or s[i] = = 'E' : inputtype = EXPONENT state = transitionTable[state][inputtype] if state = = - 1 : return False else : i + = 1 return state = = 1 or state = = 4 or state = = 7 or state = = 8 |
C++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class Solution { public : bool isNumber(string s) { bool num = false , numAfterE = true , dot = false , exp = false , sign = false ; int n = s.size(); for ( int i = 0; i < n; ++i) { if (s[i] == ' ' ) { if (i < n - 1 && s[i + 1] != ' ' && (num || dot || exp || sign)) return false ; } else if (s[i] == '+' || s[i] == '-' ) { if (i > 0 && s[i - 1] != 'e' && s[i - 1] != ' ' ) return false ; sign = true ; } else if (s[i] >= '0' && s[i] <= '9' ) { num = true ; numAfterE = true ; } else if (s[i] == '.' ) { if (dot || exp ) return false ; dot = true ; } else if (s[i] == 'e' ) { if ( exp || !num) return false ; exp = true ; numAfterE = false ; } else return false ; } return num && numAfterE; } }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构