剑指 Offer 20. 表示数值的字符串


剑指 Offer 20. 表示数值的字符串

解题思路

这题乍一看题目都看不懂???
其实只要总结一下规律,只有以下几种情况是合法的:

  • ‘.’出现正确情况:只出现一次,且在e的前面

  • ‘e’出现正确情况:只出现一次,且出现前有数字

  • ‘+’‘-’出现正确情况:只能在开头和e后一位

  • 字符串必须以数字结尾

  • 其实eE 都要考虑

代码

class Solution {
    public boolean isNumber(String s) {
        if (s == null || s.length() == 0) return false;
        //去掉首位空格
        s = s.trim();//trim() 方法用于删除字符串的头尾空白符。
        boolean numFlag = false;
        boolean dotFlag = false;
        boolean eFlag = false;
        for (int i = 0; i < s.length(); i++) {
            //判定为数字,则标记numFlag
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                numFlag = true;
                //判定为.  需要没出现过.并且没出现过e
            } else if (s.charAt(i) == '.' && !dotFlag && !eFlag) {
                dotFlag = true;
                //判定为e,需要没出现过e,并且出过数字了
            } else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {
                eFlag = true;
                numFlag = false;//为了避免123e这种请求,出现e之后就标志为false
                //判定为+-符号,只能出现在第一位或者紧接e后面
            } else if ((s.charAt(i) == '+' || s.charAt(i) == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {

                //其他情况,都是非法的
            } else {
                return false;
            }
        }

        //必须以数字结尾。因为在判断e的时候把numFlag=false了。如果是正确的,那么一定是以数字结尾的,那么一定会进入到判定为数字的那个if,然后numFlag=true
        return numFlag;
    }
}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录