LeetCode(剑指 Offer)- 20. 表示数值的字符串

Posted 程序员牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 20. 表示数值的字符串相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:略。

解题思路:解决方案(1) 状态转移表,看懂算我输。

相关企业

  • 字节跳动

AC 代码

// 解决方案(1)
class Solution 
    public boolean isNumber(String s) 
        Map[] states = 
            new HashMap<>()  put(' ', 0); put('s', 1); put('d', 2); put('.', 4); , // 0.
            new HashMap<>()  put('d', 2); put('.', 4); ,                           // 1.
            new HashMap<>()  put('d', 2); put('.', 3); put('e', 5); put(' ', 8); , // 2.
            new HashMap<>()  put('d', 3); put('e', 5); put(' ', 8); ,              // 3.
            new HashMap<>()  put('d', 3); ,                                        // 4.
            new HashMap<>()  put('s', 6); put('d', 7); ,                           // 5.
            new HashMap<>()  put('d', 7); ,                                        // 6.
            new HashMap<>()  put('d', 7); put(' ', 8); ,                           // 7.
            new HashMap<>()  put(' ', 8);                                          // 8.
        ;
        int p = 0;
        char t;
        for(char c : s.toCharArray()) 
            if(c >= '0' && c <= '9') t = 'd';
            else if(c == '+' || c == '-') t = 's';
            else if(c == 'e' || c == 'E') t = 'e';
            else if(c == '.' || c == ' ') t = c;
            else t = '?';
            if(!states[p].containsKey(t)) return false;
            p = (int)states[p].get(t);
        
        return p == 2 || p == 3 || p == 7 || p == 8;
    


// 解决方案(2)
class Solution 
    public boolean isNumber(String s) 
        s = s.trim().toLowerCase();
        if (s.length() == 0) 
            return false;
        
        String[] split = s.split("e");
        if (split.length > 2) 
            return false;
         else if (split.length == 2 && s.charAt(s.length() - 1) != 'e') 
            return isOkay(split[0]) && isInteger(split[1]);
         else if (split.length == 1) 
            return isOkay(s);
        
        return false;
    

    private boolean isOkay(String s) 
        return isInteger(s) || isDecimal(s);
    

    private boolean isInteger(String s) 
        if (s.length() == 0) 
            return false;
        
        char[] chars = s.toCharArray();
        // 先解决第一个, 省得后面 for 一直要判断 "+"、"-"
        char c = chars[0];
        if (c >= 'a' && c <= 'z' || c == ' ' || c == '.') 
            return false;
         else if ((c == '+' || c == '-') && s.length() == 1) 
            return false;
        
        for (int i = 1; i < chars.length; i++) 
            c = chars[i];
            if (c >= 'a' && c <= 'z' || c == ' ' || c == '.' || c == '+' || c == '-') 
                return false;
            
        
        return true;
    

    private boolean isDecimal(String s) 
        if (s.length() == 0) 
            return false;
        
        char[] chars = s.toCharArray();
        boolean dot = true;
        // 先解决第一个, 省得后面 for 一直要判断 "+"、"-"、"."
        char c = chars[0];
        if (c >= 'a' && c <= 'z' || c == ' ') 
            return false;
         else if ((c == '+' || c == '-') && s.length() == 1) 
            return false;
         else if ((c == '+' || c == '-') && chars[1] == '.' && s.length() == 2) 
            return false;
         else if (c == '.') 
            if (s.length() == 1) 
                return false;
            
            dot = false;
        

        for (int i = 1; i < chars.length; i++) 
            c = chars[i];
            if (c == '.') 
                if (dot) 
                    dot = false;
                 else 
                    return false;
                
            
            else if (c >= 'a' && c <= 'z' || c == ' ' || c == '+' || c == '-') 
                return false;
            
        
        return true;
    


// 解决方案(3)
class Solution 
    public boolean isNumber(String s) 
        try 
            char c = Character.toLowerCase(s.charAt(s.length() - 1));
            if ('f' == c || 'd' == c) 
                return false;
            
            Double.valueOf(s);
            return true;
         catch (NumberFormatException e) 
            return false;
        
    

以上是关于LeetCode(剑指 Offer)- 20. 表示数值的字符串的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode]剑指 Offer 05. 替换空格

[LeetCode]剑指 Offer 05. 替换空格

LeetCode剑指Offer刷题总结

[LeetCode]剑指 Offer 20. 表示数值的字符串

[LeetCode]剑指 Offer 07. 重建二叉树

总结leetcode剑指offer分类学习速成