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.rhkb.cn/news/76791.html

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

相关文章

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言&#xff1a;vite只支持高版本的nodejs&#xff0c;而高版本的nodejs只支持windows8及以上&#xff0c;且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下&#xff0c;我的是12.12.0这个版本。nodejs低版本官网下载…

【前端】搭建Vue3框架

目录 一、搭建准备二、node.js安装1、下载并安装2、配置默认安装目录和缓存日志目录①、创建默认安装目录和缓存日志目录&#xff08;我的node.js目录在D盘&#xff0c;所以直接在node.js文件夹下创建&#xff09;②、执行命令&#xff0c;配置默认安装目录和缓存日志目录到刚才…

Java ThreadPoolExecutor,Callable,Future,FutureTask 详解

目 录 一、ThreadPoolExecutor类讲解 1、线程池状态 五种状态 2、ThreadPoolExecutor构造函数 2.1&#xff09;线程池工作原理 2.2&#xff09;KeepAliveTime 2.3&#xff09;workQueue 任务队列 2.4&#xff09;threadFactory 2.5&#xff09;handler 拒绝策略 3、常…

【JMeter】 使用Synchronizing Timer设置请求集合点,实现绝对并发

目录 布局设置说明 Number of Simulated Users to Group Timeout in milliseconds 使用时需要注意的点 集合点作用域 实际运行 资料获取方法 布局设置说明 参数说明&#xff1a; Number of Simulated Users to Group 每次释放的线程数量。如果设置为0&#xff0c;等同…

【css】使用float实现水平导航栏

该实例使用float 浮动实现元素浮动在水平方向&#xff0c;从而实现水平导航栏效果。 overflow: hidden&#xff1a;当不给父级元素设置高度的时候&#xff0c;其内部元素浮动后会导致下面的元素顶上去&#xff0c;这是因为子元素浮动后&#xff0c;子元素脱离标准流&#xff0…

深度学习——注意力机制、自注意力机制

什么是注意力机制&#xff1f; 1.注意力机制的概念&#xff1a; 我们在听到一句话的时候&#xff0c;会不自觉的捕获关键信息&#xff0c;这种能力叫做注意力。 比如&#xff1a;“我吃了100个包子” 有的人会注意“我”&#xff0c;有的人会注意“100个”。 那么对于机器来说…

C语言:相交链表

Lei宝啊&#xff1a;个人主页 愿美好与我们不期而遇 题目&#xff1a; 描述 给你两个单链表的头节点 headA和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 接口 struct ListNode *getIntersectionNode (str…

与“云”共舞,联想凌拓的新科技与新突破

伴随着数字经济的高速发展&#xff0c;IT信息技术在数字中国建设中起到的驱动和支撑作用也愈发凸显。特别是2023年人工智能和ChatGPT在全球的持续火爆&#xff0c;更是为整个IT产业注入了澎湃动力。那么面对日新月异的IT信息技术&#xff0c;再结合疫情之后截然不同的经济环境和…

springboot+vue网红酒店客房预定系统的设计与实现_ui9bt

随着计算机技术发展&#xff0c;计算机系统的应用已延伸到社会的各个领域&#xff0c;大量基于网络的广泛应用给生活带来了十分的便利。所以把网红酒店预定管理与现在网络相结合&#xff0c;利用计算机搭建网红酒店预定系统&#xff0c;实现网红酒店预定的信息化。则对于进一步…

当你软件测试遇上加密接口,是不是就不能测了?

相信大家在工作中做接口测试的时候&#xff0c;肯定会遇到一个场景&#xff0c;那就是你们的软件&#xff0c;密码是加密存储的。 那么这样的话&#xff0c;我们在执行接口的时候&#xff0c;对于密码的处理就开始头疼了。 所以&#xff0c;本文将使用jmeter这款java开源的接…

Pytorch Tutorial【Chapter 3. Simple Neural Network】

Pytorch Tutorial【Chapter 3. Simple Neural Network】 文章目录 Pytorch Tutorial【Chapter 3. Simple Neural Network】Chapter 3. Simple Neural Network3.1 Train Neural Network Procedure训练神经网络流程3.2 Build Neural Network Procedure 搭建神经网络3.3 Use Loss …

海外应用商店优化实用指南之关键词

和SEO一样&#xff0c;关键词是ASO中的一个重要因素。就像应用程序标题一样&#xff0c;在Apple App Store和Google Play中处理应用程序关键字的方式也有所不同。 关键词研究。 对于Apple&#xff0c;我们的所有关键词只能获得100个字符&#xff0c;Google Play没有特定的关键…

【新版系统架构补充】-传输介质、子网划分

传输介质 双绞线&#xff1a;无屏蔽双绞线UTP和屏蔽双绞线STP&#xff0c;传输距离在100m内 网线安装标准&#xff1a; 光纤&#xff1a;由纤芯和包层组成&#xff0c;分多模光纤MMF、单模光纤SMF 无线信道&#xff1a;分为无线电波和红外光波 通信方式和交换方式 单工…

做测试8年,33岁前只想追求大厂高薪,今年只求稳定收入

疫情3年&#xff0c;每一个行业的危机&#xff0c;每一个企业的倒下&#xff0c;背后都是无数人的降薪、降职和失业。这也暴露了人生的残酷真相&#xff1a;人活一辈子&#xff0c;总有“丰年”和“荒年” 优秀的测试既过得了丰年&#xff0c;也受得住荒年 一个测试宝妈&…

数据结构: 线性表(带头双向循环链表实现)

之前一章学习了单链表的相关操作, 但是单链表的限制却很多, 比如不能倒序扫描链表, 解决方法是在数据结构上附加一个域, 使它包含指向前一个单元的指针即可. 那么怎么定义数据结构呢? 首先我们先了解以下链表的分类 1. 链表的分类 链表的结构非常多样, 以下情况组合起来就有…

爬虫---练习源码

选取的是网上对一些球员的评价&#xff0c;来评选谁更加伟大一点 import csv import requests import re import timedef main(page):url fhttps://tieba.baidu.com/p/7882177660?pn{page}headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/53…

AMEYA360:瑞萨电子MCU和MPU产品线将支持Microsoft Visual Studio Code

全球半导体解决方案供应商瑞萨电子宣布其客户现可以使用Microsoft Visual Studio Code&#xff08;VS Code&#xff09;开发瑞萨全系列微控制器&#xff08;MCU&#xff09;和微处理器&#xff08;MPU&#xff09;。瑞萨已为其所有嵌入式处理器开发了工具扩展&#xff0c;并将其…

分布式开源监控Zabbix实战

Zabbix作为一个分布式开源监控软件&#xff0c;在传统的监控领域有着先天的优势&#xff0c;具备灵活的数据采集、自定义的告警策略、丰富的图表展示以及高可用性和扩展性。本文简要介绍Zabbix的特性、整体架构和工作流程&#xff0c;以及安装部署的过程&#xff0c;并结合实战…

分布式异步任务处理组件(七)

分布式异步任务处理组件底层网络通信模型的设计--如图&#xff1a; 使用Java原生NIO来实现TCP通信模型普通节点维护一个网络IO线程&#xff0c;负责和主节点的网络数据通信连接--这里的网络数据是指组件通信协议之下的直接面对字节流的数据读写&#xff0c;上层会有另一个线程负…