leetcode 65 Valid Number


判断所给的字符串是不是数字。

这是一道hard难度的题,它的难度不是思路有多难想,而是情况种类繁多。由于样例数据只给了简单的情况,所以自己在思考的时候就没想到那么多复杂情况。每次Wrong Answer之后才知道还有这种操作。由于本人的水平有限,这道题自己没ac过去,下面是借鉴一位大佬的方法。

大佬采用的方法就是利用各种flag结合字符串当前位置上的值判断该字符串是否合理。代码如下:


    /*如果我们看到数字,就将numberFlag设为true
     *如果看到小数点,则判断是否已有小数点或是e,因为e后只能有整数
     *e只能遇到一次,如果第一次遇到e但是没有遇到数字,则返回错误。遇到第一个e后,将numberAfterE flag标注为否以便判断后序是否有数字
     *正负号的位置只能位于最开始和e紧邻着右边那个位置
     */
    public boolean isNumber(String s){
        s = s.trim();//除去字符串开头和结尾空格
        boolean pointSeen = false;
        boolean eSeen = false;
        boolean numberSeen = false;
        boolean numberAfterE = true;
        for(int i=0; i<s.length(); i++) {
            //当前值为数字
            if('0' <= s.charAt(i) && s.charAt(i) <= '9') {
                numberSeen = true;
                numberAfterE = true;
            //遇到小数点
            } else if(s.charAt(i) == '.') {
                //已经遇到小数点或是e,则出错
                if(eSeen || pointSeen) {
                    return false;
                }
                pointSeen = true;
            //遇到e
            } else if(s.charAt(i) == 'e') {
                //已经遇到e或是尚未遇到数字
                if(eSeen || !numberSeen) {
                    return false;
                }
                numberAfterE = false;
                eSeen = true;
            //遇到正负号,只能在首位或是e后面
            } else if(s.charAt(i) == '-' || s.charAt(i) == '+') {
                if(i != 0 && s.charAt(i-1) != 'e') {
                    return false;
                }
            //遇到其它符号一定是错的
            } else {
                return false;
            }
        }   
        //是否遇到小数点或是e均不重要
        return numberSeen && numberAfterE;
    }

运行结果(3ms):



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值