leetcode-65-有效的数字

验证给定的字符串是否为数字。

这个题最恶心之处在于给你的样例太少,而实际中的情况却非常复杂。很多很多意想不到的情况,不断地WA......

这个题做的人难受的一批,查了一下还是我太嫩了,大佬们都是用有限状态机来做的(不会、不存在的、下一个...)......

下面是AC代码:

import java.util.Scanner;

public class leetcode65 {

    public boolean isNumber(String s) {
        s = s.trim(); //删除前后空格

        if(s.length()<1) //那就是全是空格咯
            return false;

        boolean e=false , dian=false , number = false , fuhao = false;
        /*
        e      字母e,大坑
        fuhao  有没有正负号 +-
        dian   有没有点 .
        number 有无数字
         */

        for (int i = 0 ; i < s.length() ; i++ ) {

            if ( s.charAt(i) == '-' || s.charAt(i) == '+' ){        //判断正负号
                if(!fuhao && (i==0 || s.charAt(i-1)=='e' && i < s.length()-1 ))
                    fuhao = true; //符号变成有(true)
                else
                    return false;
            }

            else if(s.charAt(i)=='.'){  //判断小数点的有无
                if(s.length()!=1 && !dian && !e)
                    dian = true;//点变成有
                else
                    return false;
            }

            else if(s.charAt(i)=='e'){ //坑爹的字母e
                if(number && !e && i<s.length()-1){   // e前面必须要有数字,所以引入number来判断
                    e = true;
                    fuhao = false; // 因为有像 24e+6,7e-4 这种情况,一旦出现e了,fuhao-->false
                }
                else
                    return false;
            }

            else if(s.charAt(i)>='0' && s.charAt(i)<='9'){
                if(!number)  //判断是否输入了数字
                    number=true;
            }

            else {
                return false;
            }
        }
        if(number)
            return true;
        else
            return false;
    }

    public static void main(String[] args) {
        Scanner map = new Scanner(System.in);
        leetcode65 lt = new leetcode65();
        String s = map.next();
        System.out.println(lt.isNumber(s));
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值