标签:必须 poi 符号 public 科学计数法 not example ++ 面试
Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
几个要考虑的情况:整数,小数decimal,正号负号,科学计数法。问:1e9 .5, 6.可以吗(可以)? e可以和小数一起出现吗 0.5e100 (e前面可以有小数后面不行)
可以允许的符号有:‘0‘~‘9‘ ‘.‘ ‘e‘ ‘+-‘
规则有:
1. 必须有数字出现过,单独的‘.‘ ‘e‘ ‘+-‘ 都不是数字。所以最后返回numSeen && eSeen
2. ‘.‘ 只可以出现一次,而且不能出现在e后面。
3.‘e‘只可以出现一次,而且前后都必须有数字。
4.‘+-‘ 必须在最前面,或者紧跟在e后面。
5. ‘ ‘ 不能出现在中间,但可以在头尾。用s = s.trim()解决(这点面试的时候就别讲了吧,太刻意了)
实现:
class Solution { //1. ‘.‘ 只可以出现一次,而且不能出现在e后面,而且后面必须有数字。 //2.‘e‘只可以出现一次,而且前后都必须有数字。 //3.‘+-‘ 必须在最前面,或者紧跟在e后面。 //4. ‘ ‘ 不能出现在中间,但可以在头尾。(这点面试的时候就别讲了吧,太刻意了) //可以允许的符号有:‘0‘~‘9‘ ‘.‘ ‘e‘ ‘+-‘ public boolean isNumber(String s) { // 要先去掉头尾的空格 s = s.trim(); boolean numSeen = false; boolean pointSeen = false; boolean eSeen = false; boolean hasNumAfterE = false; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= ‘0‘ && c <= ‘9‘) { numSeen = true; if (eSeen) { hasNumAfterE = true; } } else if (c == ‘.‘) { if (pointSeen || eSeen) { return false; } pointSeen = true; } else if (c == ‘e‘) { if (eSeen || !numSeen) { return false; } eSeen = true; } else if (c == ‘+‘ || c == ‘-‘) { if (i != 0 && s.charAt(i - 1) != ‘e‘) { return false; } } else { return false; } } if (eSeen) { return numSeen && hasNumAfterE; } return numSeen; } }
leetcode65- Valid Number- hard
标签:必须 poi 符号 public 科学计数法 not example ++ 面试
原文地址:http://www.cnblogs.com/jasminemzy/p/7942097.html