19.表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。

但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

注意:

  • 小数可以没有整数部分,例如.123等于0.123;
  • 小数点后面可以没有数字,例如233.等于233.0;
  • 小数点前面和后面可以有数字,例如233.666;
  • 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
  • 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;

数据范围:

输入字符串长度 [0,25]。
字符串中不含空格。

样例:

输入: "0"
输出: true

代码:

class Solution {
    public boolean isNumber(String s) {
        //处理空字符串情况
        if(s == null || s.length() == 0)return false;
        //去除首尾空格
        s = s.trim();
        //处理全是空格的情况
        if(s.length() == 0)return false;
        //是否出现过数字
        boolean numSeen = false;
        //是否出现过小数点
        boolean dotSeen = false;
        //是否出现过e/E
        boolean eSeen = false;
        //e/E后面是否跟着数字
        //numAfterE 初始值为 true,因为可能没有e
        boolean numAfterE = true;
        //遍历字符串的每个字符
        for(int i = 0;i<s.length();i++){
            char c = s.charAt(i);
            //处理数字字符
            if(c>='0'&&c<='9'){
                //标记数字已经出现
                numSeen = true;
                //如果之前有e。现在e后面有数字了
                numAfterE = true;
            }else if(c=='.'){
                //小数点不能出现在e之后,也不能重复出现
                if(eSeen||dotSeen)return false;
                //标记小数点已出现
                dotSeen = true;
            }else if(c=='e'||c=='E'){
                //e/E前面必须有数字,且不能重复出现
                if(eSeen||!numSeen)return false;
                //标记e已出现
                eSeen = true;
                //重置,需要检查e后面是否有数字
                numAfterE = false;
            }else if(c == '+'||c == '-'){
                //+/-只能出现在第一位或e/E的后面
                if(i!=0&&s.charAt(i-1)!='e'&&s.charAt(i-1)!='E')return false;
            }else return false;//其余字符都是非法的
        }
        //必须有数字,且如果出现,则e后面必须有数字
        return numSeen&&numAfterE;
    }
}
posted @ 2025-05-15 09:37  回忆、少年  阅读(18)  评论(0)    收藏  举报