剑指offer 31. 表示数值的字符串-java版本

Acwing 31. 表示数值的字符串-java版本

原题链接

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

例如,字符串"+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

题解

(模拟,字符串处理) O(n)O(n)
先去除行首和行尾空格;
行首如果有一个正负号,直接忽略;
如果字符串为空或只有一个’.',则不是一个合法数;
循环整个字符串,去掉以下几种情况:
(1) '.'或’e’多于1个;
(2) '.‘在’e’后面出现;
(3) ‘e’后面或前面为空,或者’e’前面紧跟着’.’;
(4) 'e’后面紧跟着正负号,但正负号后面为空;
剩下的情况都合法;
时间复杂度分析:整个字符串只遍历一遍,所以时间复杂度是 O(n) 。

class Solution {
    public boolean isNumber(String s) {
          int i = 0;
          //首先先判断字符串是否有空格
        while (i < s.length() && s.charAt(i) == ' ') i ++ ;
        int j = s.length() - 1;
        while (j >= 0 && s.charAt(j) == ' ') j -- ;
        if (i > j) return false;
        s = s.substring(i, j +1 );
        //忽略前面的正负号
        if (s.charAt(0) == '-' || s.charAt(0) == '+') s = s.substring(1);
        if (s.isEmpty() || s.charAt(0)== '.' && s.length() == 1) return false;

        int dot = 0, e = 0;//.和e的个数
        for (  i = 0; i < s.length(); i ++ )
        {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9');//如果是正常的数 直接不管
            else if (s.charAt(i) == '.')//是点数的话
            {
                dot ++ ;
                if (e !=0 || dot > 1) return false;//.要是多余1个的话 返回假
            }
            else if (s.charAt(i) == 'e' || s.charAt(i) == 'E')//当有e出现的时候
            {
                e ++ ;
                // e后面不能为空  不能第一个是e e的个数不能大于1 后面也不能为点    .e不能连着
                if (i + 1 == s.length() || i== 0 || e > 1 || i == 1 && s.charAt(0) == '.') return false;
                if (s.charAt(i+1) == '+' || s.charAt(i+1)== '-')//e后面要是有+-号的出现
                {
                    if (i + 2 == s.length()) return false;//i+2要有数
                    i ++ ;
                }
            }
            else return false;
        }
        return true;
    
    }
}

偷懒的写法

class Solution {
    public boolean isNumber(String s) {
        try{
            new Double(s);
            return true;
        }catch(Exception e){
            return false;
        }
    }
}
posted @   依嘫  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示