题目描述
呃…比较恶心的一道题,需要读好题,分完情况再下手 有看到dalao用有限状态机来做,不过这边还是直接用了我自己的做法= =
思路 && 代码
ps:这里没有参考题解的写法,用的是方便自己理解的写法,所以可能代码有冗余,不过复杂度是没问题的~ s 分为三部分:part1 = 小数 || 整数,part2 = e/E,part3 = 整数;part23可选 新增两个函数 :isInteger() 整数判断,以及 isDecimal() 小数判断 先来一个循环,找到第一个 e / E 的位置,作为 part 的分界点 然后对 part1 进行 小数 or 整数判断,对 part3 进行整数判断即可 注意 :无论小数、整数,都需要有数字元素
class Solution { public boolean isNumber ( String s) { s = s. trim ( ) ; if ( s. length ( ) == 0 ) { return false ; } char [ ] sArr = s. toCharArray ( ) ; int eIndex = s. length ( ) ; for ( int i = 0 ; i < s. length ( ) ; i++ ) { if ( sArr[ i] == 'e' || sArr[ i] == 'E' ) { eIndex = i; } } boolean part1 = ( isInteger ( sArr, 0 , eIndex - 1 ) || isDecimal ( sArr, 0 , eIndex - 1 ) ) ; if ( eIndex != s. length ( ) ) { if ( eIndex == s. length ( ) - 1 ) { return false ; } part1 = part1 && isInteger ( sArr, eIndex + 1 , s. length ( ) - 1 ) ; } return part1; } public boolean isInteger ( char [ ] arr, int start, int end) { int numsCount = 0 ; int index = start; if ( arr[ index] == '-' || arr[ index] == '+' ) { index++ ; } for ( ; index <= end; index++ ) { if ( arr[ index] < '0' || arr[ index] > '9' ) { return false ; } numsCount++ ; } return numsCount > 0 ; } public boolean isDecimal ( char [ ] arr, int start, int end) { int index = start; if ( arr[ index] == '-' || arr[ index] == '+' ) { index++ ; } int pointNums = 0 , numCount = 0 ; for ( ; index <= end; index++ ) { if ( arr[ index] == '.' ) { pointNums++ ; continue ; } else if ( arr[ index] < '0' || arr[ index] > '9' ) { return false ; } numCount++ ; } return pointNums == 1 && numCount != 0 ; }
}