首页 > 编程知识 正文

怎么判断一个数是不是二进制(如何判断二进制数为负数)

时间:2023-05-04 12:33:49 阅读:92488 作者:2228

题目描述

验证指定的字符串是否可以解释为十进制。

样本:

'0'=真

0.1=真

' ABC '=假

'1a '=假

' 2e 10 '=真

'-90 E3 '=真

1e=假

E3=假

' 6e-1 '=真

' 99e 2.5 '=假

' 53.5 e93 '=真

'--6'=假

'-3 '=假

' 95 a 54e 53 '=假

数字: 0-9

小数点:

符号:-

看到指数: e

解题思路

问题的学生应该发现,如果使用Python,大多数人会直接调用float函数,如果转换成功则返回True,如果抛出异常则返回False。 不得不说正是zqdsj。 但是,用这种方法求解对提高自己没有多大帮助。 下面说明使用自动机的方法

我们的目标是建立DFA。 模拟输入字符串在DFA上的行为。 处理最后一个输入的字符后,如果DFA处于接受状态,则可以将该字符串解释为十进制。 否则,就不能。 但是,直接构建满足条件的DFA很难,必须经过曲线救国的过程。 首先,必须构建与所需字符串匹配的正则表达式。 基于正则表达式构建对应的NFA,最后将NFA转换为等价的DFA。 有了这个DFA,就可以构筑对应的状态变换表,在代码中使用。

如何制定与十进制一致的正则表达式? 首先说一下我的想法,十进制可以分为三个部分,即: 1 )符号位; 2 )基础; 3 )乘方例如,“-123.32e 4”时,符号的比特和乘方可以为空,写这两部分的正则比较简单。 base的部分有“23 .”、“23”、“. 34”四种形式,写与这四种形式一致的正则也比较简单,所以请试着自己实现各部分的正则。 各部分的

正则化成立后,就可以构筑对应的NFA了。 but how? 首先来看正则表达式,主要包括连接或闭包三个基本操作,更复杂的正则表达式也是这三个基本操作的组合,只要知道这三个基本操作的NFA是如何构成的,就可以构建与上面得到的正则表达式相对应的NFA

有了NFA,就需要构建等效的DFA。 等价是指两者接收的字符串集合相同。 由于NFA的状态迁移不确定,因此转换为DFA后容易进行模拟。 通常使用子集构建算法进行从NFA到DFA的转换,但是为了得到DFA的状态转换表,这里基于先前计算的NFA手动模拟子集构建算法的执行,得到的状态转换表为以下:

DFA状态转移表

其中,状态2、4、5、7、8、10为接受状态

代码实现

级解决方案3360

表=[

1,2,3,-1,-1,

[-1,2,3,-1,-1]、

[-1,4,5,6,-1]、

[-1,7,-1,-1,-1]、

[-1,4,8,6,-1]、

[-1,7,- 1,6,-1]、

[ 9,10,-1,-1,-1]、

[-1,7,- 1,6,-1]、

[-1,8,- 1,6,-1]、

[-1,10,-1,-1,-1]、

[-1,10,-1,-1,-1]

]

finals=[ 0,0,1,0,1,1,0,1,1,0,1 ]

自由号(s: str ) -布尔:

返回解决方案. DFA (s (

@静态方法

EFDFA(s:str ) -布尔:

s=秒()

q=0 # DFA的初始状态

在s :上

q=解决方案.移动(q,ch ) )。

# #跟踪状态转移

# #打印(状态: % d ) % q ) )

if q==-1:

返回假

返回解决方案.金融==1

@静态方法

def move (q :英寸,通道) :

if ch in ' -':

idx=0

elif ch in '0123456789':

idx=1

'.' :生命周期

idx=2

' e ' :生命中

idx=3

else:

idx=4

return Solution.table[q][idx]享受更多的leet代码问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。