LeetCode--剑指Offer75(3)

目录

  • 题目描述:剑指 Offer 20. 表示数值的字符串(中等)
    • 题目接口
    • 解题思路
      • 什么是有限状态自动机?
      • 如何使用?
    • 代码
  • PS:

题目描述:剑指 Offer 20. 表示数值的字符串(中等)

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

数值(按顺序)可以分成以下几个部分:

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"]

LeetCode做题链接:LeetCode-表示数值的字符串

示例 1:

输入:s = "0"
输出:true

示例 2:

输入:s = "e"
输出:false

示例 3:

输入:s = "."
输出:false

示例 4:

输入:s = "    .1  "
输出:true

提示:

1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

题目接口

class Solution {public boolean isNumber(String s) {}
}

解题思路

参考题解:表示数值的字符串(有限状态自动机,清晰图解)

什么是有限状态自动机?

有限状态自动机的是指将有限状态自动机的模型转化为可执行的计算机程序的算法。它描述了如何根据有限状态自动机的定义和规则实现状态转移、状态判断和行为执行等功能。
通常情况下,有限状态自动机的编程算法包括以下几个主要步骤:

1.状态定义:根据实际需求,定义有限状态自动机的状态集合。每个状态可以用一个唯一的标识符或符号来表示。

2.输入定义:确定输入信号的集合。输入信号是触发状态转移的触发器,可以是字符、事件、条件等。

3.状态转移规则定义:根据状态和输入信号,定义状态之间的转移规则。规则描述了在特定状态下接收到特定输入信号时,系统应该转移到哪个状态。

4.状态转移函数实现:根据状态转移规则,实现状态转移函数。该函数接收当前状态和输入信号作为参数,并根据规则确定下一个状态。

5.状态判断:在每个状态转移后,根据当前状态和其他条件判断是否满足某些特定的状态条件。这些条件可以用于触发特定的行为或其他操作。

6.行为执行:根据当前状态和其他条件,执行相应的行为或操作。这些行为可以是输出、状态更新、操作等。
根据具体的编程语言和开发环境,有限状态自动机的编程算法可能会有所差异。在实际实现时,可以使用面向对象编程、状态模式等技术来组织和管理状态转移和行为执行的逻辑。
总之,有限状态自动机的编程算法将有限状态自动机的抽象模型转化为计算机可执行的程序,使得我们可以根据预定义的规则和条件来控制系统的行为。

如何使用?

主要难点在于定义所有的状态~
先定义状态,再画出状态转移图,最后编写代码

按照字符串从左到右的顺序,定义以下 9 种状态。

1.开始的空格
2.幂符号前的正负号
3.小数点前的数字
4.小数点、小数点后的数字
5.当小数点前为空格时,小数点、小数点后的数字
6.幂符号
7.幂符号后的正负号
8.幂符号后的数字
9.结尾的空格

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

代码

//小数表示可省去0,-0.4 = -.4,0.4 = .4;2.、3. = 2、3,小数点前有数,后面可以不跟数代表原数
//注意e8即10的8次幂(8次方),也可以是e-7,但题目要求必须跟整数
//题目规定是数值前后可有空格,中间不能有,这个情况要考虑清楚。s:符号、d:数字
class Solution {public boolean isNumber(String s) {Map[] states = {//0:规定0是初值,字符串表示数值,有4种起始状态,开头空格、符号、数字、前面没有数的小数点//其中 开头空格 还是指向states[0],上一位是 开头空格,下一位可以是 空格、符号、数字、前面没有数的小数点new HashMap<>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, //1:上一位是符号,符号位后面可以是 数字、前面没有数的小数点new HashMap<>() {{ put('d', 2); put('.', 4); }},//2:上一位是数字,数字的下一位可以是 数字、前面有数的小数点、e、结尾空格new HashMap<>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, //3:上一位是前面有数的小数点,下一位可以是 数字、e(8.e2 = 8e2,和2的情况一样)、结尾空格new HashMap<>() {{ put('d', 3); put('e', 5); put(' ', 8); }},//4:上一位是前面没有数的小数点,下一位只能是 数字(符号肯定不行,e得前面有数才行)              new HashMap<>() {{ put('d', 3); }},//5:上一位是e,下一位可以是 符号、数字new HashMap<>() {{ put('s', 6); put('d', 7); }},//6::上一位是e后面的符号,下一位只能是 数字new HashMap<>() {{ put('d', 7); }},//7:上一位是e后面的数字,下一位可以是 数字、结尾空格new HashMap<>() {{ put('d', 7); put(' ', 8); }},//8:上一位是结尾空格,下一位只能是 结尾空格new HashMap<>() {{ put(' ', 8); }}};int p = 0;char t;//遍历字符串,每个字符匹配对应属性并用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 = '?';//当前字符标记和任何一种当前规定格式都不匹配,直接返回falseif(!states[p].containsKey(t)) return false;//更新当前字符的规定格式,进入下一个规定的Map数组p = (int)states[p].get(t);}//2(正、负整数)、3(正、负小数)、7(科学计数法!)、8(前三种形式的结尾加上空格)//只有这四种才是正确的结尾return p == 2 || p == 3 || p == 7 || p == 8;}
}

成功!
在这里插入图片描述

PS:

感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个喔~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/53716.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

子集——力扣78

文章目录 题目描述法一 迭代法实现子集枚举题目描述 法一 迭代法实现子集枚举 class Solution {public:vector<int> t;vector<vector<

carla中lka实现(一)

前言&#xff1a; 对于之前项目中工作内容进行总结&#xff0c;使用Carla中的车辆进行lka算法调试&#xff0c;整体技术路线&#xff1a; ①在Carla中生成车辆&#xff0c;并在车辆上搭载camera&#xff0c;通过camera采集图像数据&#xff1b; ②使用图像处理lka算法&#…

Pytest自动化测试框架---(单元测试框架)

unittest是python自带的单元测试框架&#xff0c;它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作&#xff0c;使得单元测试易于开展&#xff0c;因为它的易用性&#xff0c;很多同学也拿它来做功能测试和接口测试&#xff0c;只需简单开发一些功能&#xff08;…

Golang 函数参数的传递方式 值传递,引用传递

基本介绍 我们在讲解函数注意事项和使用细节时&#xff0c;已经讲过值类型和引用类型了&#xff0c;这里我们再系统总结一下&#xff0c;因为这是重难点&#xff0c;值类型参数默认就是值传递&#xff0c;而引用类型参数默认就是引用传递。 两种传递方式&#xff08;函数默认都…

【C语言进阶】数据的存储----浮点型篇

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言—探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 ​&#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;GeekHub &#x1f341; 如果觉得博…

8.5day06 框架基础--反射+注解

文章目录 反射获取类的各种信息获取类的字节码文件 注解元注解 复习redis两道算法题 摆烂了&#xff0c;不想学啦&#xff01;&#xff01;&#xff01; 反射 反射主要用来做框架; 学习内容 获取类的各种信息 第一步 加载类&#xff0c;获取类的字节码文件 第二步 获取类的…

2021-06-16 Multisim74LS161S设计13进制计数器!

缘由求&#xff01;74LS161S设计13进制计数器&#xff01;-其他-CSDN问答

GaussDB数据库的元数据及其管理简介

目录 一、前言 二、元数据简介 1、元数据定义 2、元数据分类 3、数据库元数据管理 三、GaussDB数据库的元数据管理 1、GaussDB数据库的元数据管理 2、通过“SQL 系统表/系统视图/系统函数”的方式管理&#xff08;采集&#xff09;元数据 1&#xff09;获取表、视图及…

ArduPilot开源代码之Companion Computers简单分析

ArduPilot开源代码之Companion Computers简单分析 1. 源由2. 伴机系统2.1 APSync2.2 DroneKit2.3 FlytOS2.4 Maverick2.5 ROS2.6 Rpanion-server 3. 总结4. 参考资料 1. 源由 从稳定性&#xff0c;社区群体&#xff0c;以及开源方式的角度看&#xff0c;Ardupilot是不错的选择…

Java thymeleaf bug排查记录

刚学Java 做项目时报了一个错误 一时间看的莫名其妙 EL1008E: Property or field createTime cannot be found on object of type java.util.HashMap - maybe not public or not valid? 随即向上排查至第一个报错&#xff0c;发现是thymeleaf渲染时报错。 Exception proces…

【深度学习_TensorFlow】感知机、全连接层、神经网络

写在前面 感知机、全连接层、神经网络是什么意思&#xff1f; 感知机&#xff1a; 是最简单的神经网络结构&#xff0c;可以对线性可分的数据进行分类。 全连接层&#xff1a; 是神经网络中的一种层结构&#xff0c;每个神经元与上一层的所有神经元相连接,实现全连接。 神经…

设计模式之策略模式(Strategy)

一、概述 定义一系列的算法&#xff0c;把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。 2.需要使用一个算法的不同变体。…