LeetCode第65题:有效数字(困难)

LeetCode第65题:有效数字(困难)

  • 题目:验证给定的字符串是否可以解释为十进制数字。我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:数字 0-9、指数 - “e”、正/负号 - “+”/"-"、小数点 - “.” 当然,在输入中,这些字符的上下文也很重要。

  • 思路一:暴力解法,逐位考虑字符串。情况很多,容易考虑不全面。一直改了好久,好累呀。。。

class Solution {
    public boolean isNumber(String s) {
        int len = s.length();
        int i = 0;
        boolean fuhao = false;
        boolean zhishu = false;
        boolean xiaoshu = false;
        boolean shuzi = false;
        boolean fei = false;
        while(i<len){
            char a = s.charAt(i);
            //其他字符
            if((a>='A' && a<='Z') || (a>='a' && a<='z' && a!='e')){
                return false;
            }else if(a==' '){//空格情况
                if(i==0 && len==1) return false;//只有空格
                while(i<len){
                    a = s.charAt(i);
                    if(a==' '){
                        if(shuzi==false && i==len-1) return false;
                        i++;
                    }else{
                        if(shuzi==true || xiaoshu==true || zhishu==true ||fuhao==true) return false;
                        break;
                    }
                }
                
            }else if(a<='9' && a>='0'){//数字情况
                if(a!='0') fei=true;
                shuzi=true;
                i++;
            }else if(a=='e'){//‘e’情况
                if(zhishu) return false;
                if(shuzi==false || i==len-1) return false;
                zhishu=true;
                shuzi=false;
                fuhao=false;
                xiaoshu =false;
                i++;
            }else if(a=='.'){//小数点情况
                if(shuzi==false && i==len-1) return false;
                if(xiaoshu) return false;
                if(zhishu) return false;
                xiaoshu=true;
                i++; 
            }else if(a=='+' || a=='-'){//正负符号情况
                if(i==len-1) return false;
                if(shuzi==false && fuhao==false && xiaoshu==false){
                    fuhao=true;
                    i++;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
}

在这里插入图片描述

  • 思路二:利用了DFA解决,大概明白是什么意思,估计下次遇到还是不会选择这种方法。讨人厌的图灵。。。
class Solution {
    public int make(char c) {
        switch(c) {
            case ' ': return 0;
            case '+':
            case '-': return 1;
            case '.': return 3;
            case 'e': return 4;
            default:
                if(c >= 48 && c <= 57) return 2;
        }
        return -1;
    }
    
    public boolean isNumber(String s) {
        int state = 0;
        int finals = 0b101101000;
        int[][] transfer = new int[][]{{ 0, 1, 6, 2,-1},
                                       {-1,-1, 6, 2,-1},
                                       {-1,-1, 3,-1,-1},
                                       { 8,-1, 3,-1, 4},
                                       {-1, 7, 5,-1,-1},
                                       { 8,-1, 5,-1,-1},
                                       { 8,-1, 6, 3, 4},
                                       {-1,-1, 5,-1,-1},
                                       { 8,-1,-1,-1,-1}};
        char[] ss = s.toCharArray();
        for(int i=0; i < ss.length; ++i) {
            int id = make(ss[i]);
            if (id < 0) return false;
            state = transfer[state][id];
            if (state < 0) return false;
        }
        return (finals & (1 << state)) > 0;
    }
}

作者:user8973
链接:https://leetcode-cn.com/problems/valid-number/solution/biao-qu-dong-fa-by-user8973/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1373

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/104314528