标签:style blog color io ar for sp div on
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.
这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。
对于小数点出现的时候,我们要满足一下这些条件:(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。
对于正负号出现的情况,要满足条件:(1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字。
对于‘e’和‘E’的情况,要满足:(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。
根据上面列举的情况,我们用两个标签和做前后位的判断来实现,算法复杂度比较明显是O(n)的,只需要O(1)的额外空间。代码如下:
其中最难理解第11行,要这样理解:小数点正确的出现方式是————除了不能有小数点或者‘e’和‘E’之外,前一位或后一位至少有一个数字,说的确切一点是:(前一位是数字&&不是第一位)||(后一位是数字&&不是最后一位)。本例是要找出那些小数点错误出现的case来return false,而小数点错误出现的条件就是不满足上面正确出现的条件,所以对上面正确条件取反,进而得到:(是第一位||前一位不是数字)&&(是最后一位||后一位不是数字),这就是小数点错误出现的条件,即
(i==0 || !(s.charAt(i-1)>=‘0‘ && s.charAt(i-1)<=‘9‘)) && (i==s.length()-1 || !(s.charAt(i+1)>=‘0‘ && s.charAt(i+1)<=‘9‘))
1 public class Solution { 2 public boolean isNumber(String s) { 3 if (s == null) return false; 4 s = s.trim(); 5 if (s.length() == 0) return false; 6 boolean dotFlag = false; 7 boolean eFlag = false; 8 for (int i=0; i<s.length(); i++) { 9 switch(s.charAt(i)) { 10 case ‘.‘: 11 if (dotFlag || eFlag || (i==0 || !(s.charAt(i-1)>=‘0‘ && s.charAt(i-1)<=‘9‘)) && (i==s.length()-1 || !(s.charAt(i+1)>=‘0‘ && s.charAt(i+1)<=‘9‘))) { 12 return false; 13 } 14 dotFlag = true; 15 break; 16 case ‘+‘: 17 case ‘-‘: 18 if ((i>0 && (s.charAt(i-1)!=‘e‘) && s.charAt(i-1)!=‘E‘) || i==s.length()-1 || !(s.charAt(i+1)>=‘0‘ && s.charAt(i+1)<=‘9‘ || s.charAt(i+1)==‘.‘)) { 19 return false; 20 } 21 break; 22 case ‘E‘: 23 case ‘e‘: 24 if (eFlag || i==0 || i==s.length()-1) { 25 return false; 26 } 27 eFlag = true; 28 break; 29 case ‘0‘: 30 case ‘1‘: 31 case ‘2‘: 32 case ‘3‘: 33 case ‘4‘: 34 case ‘5‘: 35 case ‘6‘: 36 case ‘7‘: 37 case ‘8‘: 38 case ‘9‘: 39 break; 40 default: return false; 41 } 42 } 43 return true; 44 } 45 }
标签:style blog color io ar for sp div on
原文地址:http://www.cnblogs.com/EdwardLiu/p/4021977.html