这一题主要的难点还是要考虑的边界条件太多,而且有些情况下,指数和底数需要考虑的还不一样,就更增加了难度。
我的做法如下:
首先,对字符串左右去空格,然后根据字符e
来进行划分,e
之前的归为底数,e
之后的归为指数。这个时候在使用Java的split()
函数时要注意的时当分隔符是原字符串的首字母时,拆分之后的数组的第一个元素会是空字符串。所以,其实我们在去空格之后就可以对原字串做一些判断,直接筛选掉一些明显错误的情况。
然后,对指底数字符串和指数字符串分别进行遍历,那么遍历过程中最需要注意的就是对小数点.
的检测。专门设置一个boolean
变量还表示当前检测的字符串是不是小数,在第一次检测到小数点.
且其后还有内容的时候,对这个值赋true
,当再一次出现小数点的时候即可判断当前字符串不合法。还有一点就是遍历前先检测符号,这一点不需多说。
实现代码:
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 34 35 36 37 38 39
| public class Solution { public boolean isNumber(String s) { boolean result = true; s = s.trim(); if (s.length() == 0 || s.charAt(0) == 'e' || s.charAt(s.length() - 1) == 'e' || splitArr.length > 2) return false; String[] splitArr = s.split("e"); for (int k = 0; k < splitArr.length; k++) { String str = splitArr[k]; boolean isDecimal = false; if (str.charAt(0) == '-' || str.charAt(0) == '+') str = str.substring(1, str.length()); if (str.length() == 0) { result = false; break; } for (int i = 0; i < str.length(); i++) { if ('0' <= str.charAt(i) && str.charAt(i) <= '9') continue; else if (str.charAt(i) == '.' && !isDecimal) { if (k != 1 && str.length() > 1) { isDecimal = true; } else { result = false; break; } } else { result = false; break; } } if (!result) break; } return result; } }
|