处理浮点数的状态机

这个问题来自于 leetcode 065:

Valid Number

如果用正则表达式来写一个浮点数的解析,大概是这样的:

[+-]?(([0-9]+\.?) | (\.[0-9]))[0-9]*([eE][+-]?[0-9]+)?

我自己使用 dot 画了一个状态机出来:

如果编写代码来模拟这个状态机,可以拆分为 “eE" 前后两部分分开处理; “eE” 前面的部分,还可以拆成 “.” 前后两部分(如果有点)来编写。

这道题目在 leetcode 上难度为 Hard,可以看出来这种不起眼的小细节,更能考验基本功。

------------------

由于字数限制,附上我话这个状态机使用的源码:

 1 digraph {
 2     graph [fontname = "Microsoft YaHei",fontsize=16 ranksep=1.0 splines=1 overlap=false size="16, 16" compound=true]
 3     edge [fontname = "Microsoft YaHei",fontsize=16]
 4     node [fontname = "Microsoft YaHei",fontsize=16 weight=2 rank=same width=1 rankdir=LR]
 5
 6     p0[label="Start"]
 7     p2[label="Initial-Check"]
 8     p4[label="Dot-First"]
 9     p5[label="After-E"]
10     p6[label="After-E-Mark"]
11     p7[label="Almost-Done"]
12     p8[label="End"]
13     p9[label="Sign-Mark"]
14     pa[label="After-Dot"]
15
16
17     p0 -> p9[label="[+-]"]
18     p0 -> p9[label="blank-string"]
19
20     p9 -> p4[label="``.‘‘"]
21
22     p9 -> p2[label="[0-9]"]
23
24     p2 -> p2[label="[0-9]"]
25     p2 -> pa[label="``.‘‘"]
26     p2 -> pa[label="blank-string"]
27     p4 -> pa[label="[0-9]"]
28     pa -> pa[label="[0-9]"]
29     pa -> p8[label="$"]
30     pa -> p5[label="[Ee]"]
31     p5 -> p6[label="[+-]"]
32     p5 -> p6[label="blank-string"]
33     p6 -> p7[label="[0-9]"]
34     p7 -> p7[label="[0-9]"]
35     p7 -> p8[label="$"]
36 }
时间: 2024-10-11 12:47:37

处理浮点数的状态机的相关文章

OpenGL的状态机理解

OpenGL是一种状态机模式,比如你用glEnable打开一个状态,在以后的绘图中将一直保留并应用这个状态,除非你调用glDisable及同类函数来改变该状态或程序退出.例如当前颜色是一个状态变量,可以把当前颜色设置为白色.红色或其他任何颜色,在此之后绘制的所有物体都将使用这种颜色,直到把当前颜色设置为其他颜色. 除当前颜色之外,OpenGL绝大多数函数都是一种状态机,如控制当前视图和投影变换.直线和多边形点画模式.多边形绘图模式.像素包装约定.光照的位置和特征以及被绘制物体的材料属性等. 前一

编译原理 - 1 手撸状态机词法分析器

感谢vczh轮子叔的坑了的教程,我的编译原理第一次入了个门,词法分析写完了,今后可以看看书继续往下学了. http://www.cppblog.com/vczh/archive/2014/03/02/206014.html 词法分析,就是对于一段代码,把他们分割成一个个的token,同时记录他们的行列号,丢掉不必要的信息,这个词法分析器很简单,简单的状态机就能胜任,用正则就没有自己造轮子的快感了,所以要自己手撸状态机拆token出来. 模仿vczh的语言,我的语言包括了以下要素 标识符:大小写字

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

单精度浮点数

单精度浮点数格式 是一种计算机数据格式,在计算机存储器中占用4个字节(32 bits),利用"浮点"(浮动小数点)的方法,可以表示一个范围很大的数值. 在 IEEE 754-2008 的定义中,32-bit base 2格式被正式称为binary32格式.这种格式在IEEE 754-1985被定义为single,即单精度. 需要注意的是,在更早的一些计算机系统中,也存在着其他4字节的浮点数格式. 定义 第1位表示正负,中间8位表示指数,后23位表示有效数位. 正负号0代表正,1代表负.

Javascript优化后的加减乘除(解决js浮点数计算bug)

说明 众所周知,js在计算浮点数时候,结果可能会不准确.比如:(在chrome中的运算结果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.840000000000001 2.1 / 0.3 = 7.000000000000001 网上流传的代码(有bug) 网上流传的优化后的代码如下(有问题的代码,请勿使用) function add(a, b) { var c, d, e; try {

Java 浮点数 float或double类型的表示范围和精度

隐约记得,浮点数判断大小好像有陷阱,因为底层的二进制数不能精确表示所有的小数.有时候会产生让人觉得莫名其妙的事情. 如在java中, 0.99999999f==1f //true 0.9f==1f //false 要明白这些,首先要搞清楚float和double在内存结构 1.内存结构 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) dou

浮点数问题

(1)浮点数是有理数的集合,有些有理数不能表示,会有舍去误差如0.1等. (2)浮点数可以表示的连续整数也是有限的. 有些脚本语言,比如awk,lua中都是使用浮点数来存储整数的,也就是说,我们在语言中使用的整数,在语言内部是使用浮点数来表示的.我们知道,浮点数的运算中通常存在着一定的误差,所以整数是否能被浮点数精确表示呢?答案是可以,不过不是所有范围的整数都可以被精确的表示.由于浮点数精度的问题,所以浮点数的分布也就呈现出非均匀分布. 先简单介绍一下一个常用的浮点数在计算机中的组成,最常用的浮

简易状态机

SimpleFSM 包含状态切换以及事件驱动传递参数 下面的代码是登录的状态码 1 using System; 2 using UnityEngine; 3 using System.Collections; 4 5 public class LoginState : SingletonPrivider<LoginState>, GameState 6 { 7 private delegate void LoginEventHandler(object sender, LoginEventAr

MediaPlayer 状态机 API 详解 示例

简介 public class android.media.MediaPlayer extends Object implements VolumeAutomation 可能需要的权限: One may need to declare a corresponding(相应) WAKE_LOCK permission <uses-permission> element. <uses-permission android:name="android.permission.WAKE_