码迷,mamicode.com
首页 > 其他好文 > 详细

Valid Number

时间:2016-08-06 00:24:00      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

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.

分析:http://blog.csdn.net/linhuanmars/article/details/23809661

这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。
对于小数点出现的时候,我们要满足一下这些条件:(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。
对于正负号出现的情况,要满足条件:(1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字。
对于‘e’和‘E’的情况,要满足:(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。
根据上面列举的情况,我们用两个标签和做前后位的判断来实现,算法复杂度比较明显是O(n)的,只需要O(1)的额外空间。代码如下:

代码:http://ideone.com/7MIXt6

 1 public class Solution {
 2     static boolean isNumber(String s) {
 3         if (s == null || s.trim().length() == 0) return false;
 4  
 5         s = s.trim();
 6         int n = s.length();
 7  
 8         int opCount = 0;
 9         boolean hasE = false, hasNum = false, hasPoint = false;
10  
11         // Go through the characters
12         for (int i = 0; i < n; i++) {
13             char ch = s.charAt(i);
14             
15             if (!(ch <= 9 && ch >= 0 || ch == . || ch == e || ch == E || ch == + || ch == -)) return false;
16  
17             // number
18             if (ch >= 0 && ch <= 9) hasNum = true;
19  
20             // E
21             //(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。
22             if (ch == e || ch == E) {
23                 if (hasE || !hasNum) return false;
24                 if (i == n - 1) return false;
25                 hasE = true;
26             }
27  
28             // decimal point
29             //(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。
30             if (ch == .) {
31                 if (hasPoint || hasE) return false;
32                 if (i == n - 1 && !hasNum) return false;
33                 hasPoint = true;
34             }
35  
36             // sign
37             //(1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字
38             if (ch == + || ch == -) {
39                 if (opCount == 2) return false;
40                 if (i == n - 1) return false;
41                 if (i > 0 && !hasE) return false;
42                 opCount++;
43             }
44         }
45  
46         return true;
47     }
48 }

 

Valid Number

标签:

原文地址:http://www.cnblogs.com/beiyeqingteng/p/5743004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!