【剑指 Offer】20. 表示数值的字符串(详细解析)

第 44 日:表示数值的字符串

题目链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/submissions/

题目

在这里插入图片描述
在这里插入图片描述

解题

  1. 有限状态自动机

    解题思路:
    使用有限状态自动机。根据字符类型和合法数值的特点,先定义状态,再画出状态转移图,最后编写代码即可。
    引用K神的一张图片:

在这里插入图片描述

详细代码如下:

  public boolean isNumber(String s){
    Map<Character,Integer>[] states = new HashMap[]{//状态信息
            new HashMap<Character, Integer>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 0.
            new HashMap<Character,Integer>() {{ put('d', 2); put('.', 4); }},                           // 1.
            new HashMap<Character,Integer>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 2.
            new HashMap<Character,Integer>() {{ put('d', 3); put('e', 5); put(' ', 8); }},              // 3.
            new HashMap<Character,Integer>() {{ put('d', 3); }},                                        // 4.
            new HashMap<Character,Integer>() {{ put('s', 6); put('d', 7); }},                           // 5.
            new HashMap<Character,Integer>() {{ put('d', 7); }},                                        // 6.
            new HashMap<Character,Integer>() {{ put('d', 7); put(' ', 8); }},                           // 7.
            new HashMap<Character,Integer>() {{ put(' ', 8); }}                                         // 8.
    };
    char[] cs = s.toCharArray();
    int cur=0;//当前状态
    char t;
    for (char c : cs) {
        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 = '?';

        Integer next = states[cur].get(t);
        if (next==null){
            return false;
        }
        cur=next;
    }
    return cur == 2 || cur == 3 || cur == 7 || cur == 8;
} 
   

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值