04.表示数值的字符串

表示数值的字符串

请实现一个函数用判断字符串是否表示数值(包括整数和小数)

【数值】按顺序分为以下部分:

  1. 若干空格
  2. 一个【小数】或者【整数】
  3. (可选)一个‘e’或‘E’,后面跟着一个【整数】
  4. 若干空格

【小数】按顺序可以分为以下部分:

  1. (可选)一个符号字符(‘+’或‘-’)
  2. 下述格式之一:
    1. 至少一位数字,后面跟着一个点【.】
    2. 至少一位数字,后面跟着一个【.】,后面再跟着至少一位数字
    3. 一个点【.】,后面跟着至少一位数字

【整数】按顺序可以分为以下几个部分:

  1. (可选)一个符号字符(‘+’或‘-’)
  2. 至少一位数字
数值举例:
["+100","5e2","-123","3.1416","-1E-16","0123"]
非数值举例:
["12e","1a3.14","1.2.3","+-5","12e+5.4"]
实例:
输入:s = "0"
输出:true
输入:s = "."
输出:false
提示:
1 <= s.length <= 20
s仅含英文字母(大写和小写),数字(0-9),加号,减号,空格,或者点

有限状态自动机

【blank】空格

【sign】正负号

【digit】数字

【dot】小数点

【e】幂符号

这个代码看了很久才明白,空讲无用,下面以数值类型【-1.2E-16】和非数值型【1a.3.14】为例讲解一下代码的执行流程

【-1.2E-16】,首先for(char c: s.toCharArray())使用foreach遍历输入的字符串

第一位符号是【-】,被判断为正负号类型也就是【s】

接着将判断出的类型【s】在哈希表states[P](初始时P=0)中查找

发现对应的键值为1,并将P设置为这个对应的键值1

接下来就是不断地重复:判断确定符号类型,并将P设置为States[P]中对应的键值

当循环结束时,发现P落在7上,也就是说,【-1.2E-16】满足2、3、7、8这四种合法情况中的一种,返回true

【1a3.14】,一样的操作,不过,遍历到字符【a】时判断发现它不是合法的类型,直接返回false

/*
* 状态0:起始的空格
* 状态1:幕符号之前的正负号
* 状态2:小数点之前的数字--------------------------合法
* 状态3:小数点之后的数字--------------------------合法
* 状态4:当小数点前为空时,小数点后的数字
* 状态5:幕符号
* 状态6:幂符号之后的正负号
* 状态7:幂符号之后的数字--------------------------合法
* 状态8:结尾的空格-------------------------------合法
*/
class Solution {
	public boolean isNumber(String s) {
        Map[] states = {
            //' '空格
            //'s'正负号
            //'d'数字
            //'.'小数点
            //'e'幂符号
            new HashMap<>() {{
                put(' ',0);put('s',1);put('d',2);put('.',4); 
            }},new HashMap<>() {{
                put('d',2);put('.',4);
            }},new HashMap<>() {{
          		put('d',2);put('.',3);put('e',5);put(' ',8);
            }},new HashMap<>() {{
                put('d',2);put('e',5);put(' ',8);
            }},new HashMap<>() {{
                put('d',3);
            }},new HashMap<>() {{
                put('s',6);put('d',7);
            }},new HashMap<>() {{
                put('d',7);
            }},new HashMap<>() {{
                put('d',7);put(' ',8);
            }},new HashMap<>() {{
                put(' ',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 = '?';//非法元素
            
            //containsKey方法检查hashMap中是否存在指定的key对应的映射关系
            if(!states[p].containsKey(t)) 
                return false;//比如:如果t为'?',不在states[p]中,就会直接返回false
            
            p = (int)states[p].get(t);//将p设为t键对应的值
        }
        return p==2||p==3||p==7||p==8;
    }
}

虽然明白了自动机的执行原理,但代码的重点【状态转移表】却还是不知道如何构建

最近要写一个自动生成算式的程序,这两天可以试试构建一个关于四则运算式的【状态转移表】,并把自动机实现

Java HashMap containskey

【containsKey】方法检查hashMap中是否存在指定的key对应的映射关系

hashmap.containsKey(Object key)
//如果hashMap中存在指定的key对应的映射关系返回true,否则返回false

演示:

import java.util.HaspMap;

class Main {
	public static void main(String[] args) {
		//创建一个HashMap
        HashMap<Integer, String> sites = new HashMap<>();
        //往HashMap添加一些元素
        sites.put(1,"google");
        sites.put(1,"runoob");
        sites.put(1,"taobao");
        System.out.println("sites HashMap:"+sites);
        //检查key为1是否存在
        if(sites.containsKey(1)) {
            System.out.println("keyw");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值