剑指offer_ 表示数值的字符串
题目描述
true "+100" "5e2" "-123" "3.1416" "-1E-16"
false "12e" "1a3.14" "1.2.3" "+-5" "12e+4.3"
解题思路
使用正则表达式进行匹配。
[] : 字符集合 () : 分组 ? : 重复 0 ~ 1 次 + : 重复 1 ~ n 次 * : 重复 0 ~ n 次 . : 任意字符 \\. : 转义后的 . \\d : 数字
1 public boolean isNumeric(char[] str) { 2 if (str == null || str.length == 0) 3 return false; 4 return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?"); 5 }
还有正常解法
12e说明e的后面必须有数字,不能有两个e
+-5说明符号位要么出现一次在首位,要么出现一次在e的后一位,其他地方都不能有
12e4.3说明e的后面不能有小数,1.2.3说明不能有两个小数点
1a3.14说明不能有其他的非法字符,比如这里的a
1 public class Solution { 2 public boolean isNumeric(char[] str) { 3 //signal表示符号,decimal表示小树点,hasE表示含有符号e 4 boolean signal = false,decimal = false,hasE = false; 5 for(int i=0;i<str.length;i++){ 6 if(str[i] == 'E' || str[i] == 'e'){ 7 //e后面必须有数字,所以是最后一位肯定不通过 8 if(i==str.length-1){ 9 return false; 10 } 11 //不能有两个e 12 if(hasE){ 13 return false; 14 } 15 hasE = true; 16 }else if(str[i] == '+' || str[i] == '-'){ 17 //不是第一次出现,那么后面能出现符合的地方只有紧贴着e的后面一位,不是则不通过 18 if(signal && str[i-1] != 'E' && str[i-1] != 'e'){ 19 return false; 20 } 21 //第一次出现,如果不是出现在第一位,那么还是判断一下是不是出现在e的后面一位 22 if(!signal && i>0 && str[i-1] != 'E' && str[i-1] != 'e'){ 23 return false; 24 } 25 signal = true; 26 }else if(str[i] == '.'){ 27 //如果存在e并且e后面为小数则不通过 28 if(hasE){ 29 for(;i>=0;i--){ 30 if(str[i] == 'e' || str[i] == 'E'){ 31 return false; 32 } 33 } 34 } 35 //不能有两个小数点 36 if(decimal){ 37 return false; 38 } 39 decimal = true; 40 }else if(str[i] < '0' || str[i] > '9'){ 41 //不是e也不是+-符号也不是小数点,那么只能是数字,不是数字就是非法的字符 42 return false; 43 } 44 } 45 46 return true; 47 } 48 }

浙公网安备 33010602011771号