算法-leetcode-65-Valid Number
算法-leetcode-65-Valid Number
上代码:
# coding:utf-8
__author__ = "sn"
"""
Validate if a given string is numeric.
Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
"""
"""
思路:
1.float()...
2.去空格,正则匹配
首位是否为+或-
数字
^[0-9]{1,}[\.]{0,1}[0-9]{0,}$
^\.[0-9]{1,}$
科学计数
^[0-9]{1,}[\.]{0,1}[0-9]*e[0-9]+$
3.类似正则
合法的数字表达式有以下几种:
全数字
.全数字
数字.数字
数字e[+-]数字
按.和e作分割点,分别进行判断是否合规
先将两端的空格去掉,首字符是否为+-
判断是否数字,如果不是直接返回False,
遇到'.',判断.后是否有一列数字
遇到‘e',然后判断'e'以后是否有’+‘,’-‘
判断后续的是否是数字。
使用 if else 即可
注意边界情况;
4.把方法3的过程抽象化,得到有穷状态自动机DFA
结合本题,字符串有9种状态比较合适:
0 无输入或只有空格
1 输入了数字
2 无数字,只有dot
3只输入了符号+或-
4 有数字有dot
5 e或者E输入后的状态
6 输入e之后输入sign的状态
7 输入e之后输入数字的状态
8 有效数字输入后,输入空格判断合法输入结束
状态机简图:
"""
class Solution:
#方法3
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
begin, last = 0, len(s)-1
# 去首尾空格
while begin <= last and s[begin] == " ":
begin += 1
while last >= begin and s[last] == " ":
last -= 1
# 首位是否为+或-
if begin < last and (s[begin] == "+" or s[begin] == "-"):
begin += 1
num, dot, exp = False, False, False
# 主体校验
while begin <= last:
if s[begin] >= "0" and s[begin] <= "9":
num = True
elif s[begin] == ".":
if dot or exp:
return False
dot = True
elif s[begin] == "e" or s[begin] == "E":
if exp or not num:
return False
exp, num = True, False
elif s[begin] == "+" or s[begin] == "-":
if not(s[begin-1] == "e" or s[begin-1] == "E"):
return False
else:
return False
begin += 1
return num
# 方法4-1
# 有限状态自动机
def isNumber(self, s):
INVALID = 0;SPACE = 1; SIGN = 2; DIGIT = 3; DOT = 4; EXPONENT = 5;
transitionTable = [[-1, 0, 3, 1, 2, -1],
[-1, 8, -1, 1, 4, 5],
[-1, -1, -1, 4, -1, -1],
[-1, -1, -1, 1, 2, -1],
[-1, 8, -1, 4, -1, 5],
[-1, -1, 6, 7, -1, -1],
[-1, -1, -1, 7, -1, -1],
[-1, 8, -1, 7, -1, -1],
[-1, 8, -1, -1, -1, -1]]
state = 0; i = 0
while i < len(s):
inputtype = INVALID
if s[i] == ' ':
inputtype = SPACE
elif s[i] == '-' or s[i] == '+':
inputtype = SIGN
elif s[i] in '0123456789':
inputtype = DIGIT
elif s[i] == '.':
inputtype = DOT
elif s[i] == 'e' or s[i] == 'E':
inputtype = EXPONENT
state = transitionTable[state][inputtype]
if state == -1:
return False
else:
i += 1
return state == 1 or state == 4 or state == 7 or state == 8
# 方法4-2
# 换一种方式实现DFA
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
# define a DFA
state = [
{"space": 0, "digit": 1, "sign": 3, ".": 2},
{"digit": 1, "space": 8, "e": 5, ".": 4},
{"digit": 4},
{"digit": 1, ".": 2},
{"digit": 4, "e": 5, "space": 8},
{"digit": 7, "sign": 6},
{"digit": 7},
{"digit": 7, "space": 8},
{"space": 8}]
currentstate = 0
for c in s:
if c >= "0" and c <= "9":
c = "digit"
elif c == " ":
c = "space"
elif c in ["+", "-"]:
c = "sign"
elif c in ["e", "E"]:
c = "e"
# if c == ".":
# c ="."
if c not in state[currentstate].keys():
return False
currentstate = state[currentstate][c]
if currentstate in [1, 4, 7, 8]:
return True
else:
return False
if __name__ == "__main__":
res = Solution()
str_num = "4.7e7"
result = res.isNumber(str_num)
if result:
print("is number.")
else:
print("is not number.")
算法-leetcode-65-Valid Number的更多相关文章
- [leetcode]65. Valid Number 有效数值
Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...
- leetCode 65.Valid Number (有效数字)
Valid Number Validate if a given string is numeric. Some examples: "0" => true " ...
- [LeetCode] 65. Valid Number 验证数字
Validate if a given string can be interpreted as a decimal number. Some examples:"0" => ...
- LeetCode 65 Valid Number
(在队友怂恿下写了LeetCode上的一个水题) 传送门 Validate if a given string is numeric. Some examples: "0" =&g ...
- Leetcode 65 Valid Number 字符串处理
由于老是更新简单题,我已经醉了,所以今天直接上一道通过率最低的题. 题意:判断字符串是否是一个合法的数字 定义有符号的数字是(n),无符号的数字是(un),有符号的兼容无符号的 合法的数字只有下列几种 ...
- [LeetCode] 65. Valid Number(多个标志位)
[思路]该题题干不是很明确,只能根据用例来理解什么样的字符串才是符合题意的,本题关键在于几个标志位的设立,将字符串分为几个部分,代码如下: class Solution { public: strin ...
- 【LeetCode】65. Valid Number
Difficulty: Hard More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...
- 【leetcode】Valid Number
Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- 【一天一道LeetCode】#65. Valid Number
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Validat ...
- 65. Valid Number
题目: Validate if a given string is numeric. Some examples:"0" => true" 0.1 " = ...
随机推荐
- ubuntu更换pip源
1.创建pip.conf文件 cd ~/.pip 当提示不存在时,创建它 mkdir ~/.pip 在.pip目录下创建一个pip.conf文件 touch pip.conf 2.编辑pip.conf ...
- Python socket day5
下载文件 程序04,05 服务端在接收到文件名时应该用try来打开文件,不应该用with open来打开否则,如果文件名不存在,用with open 会出错误 客户端要判断服务端发送的数据是否为空,不 ...
- 【资源分享】Undertale(传说之下)简体中文精品整合包
*----------------------------------------------[下载区]----------------------------------------------* ...
- 无显示器安装raspberry zero w树莓派 zero w
笔者的环境 1. Macbook 电脑用于烧录树莓派系统到SD卡 2. 树莓派 zero w 把SD卡放进读卡器,插到Mac电脑上, 打开命令行工具Terminal diskutil list列出di ...
- 计算机二级-C语言-程序填空题-190109记录-对二维字符串数组的处理
//给定程序,函数fun的功能是:求出形参ss所指字符串数组中最长字符串的长度,将其余字符串右边用字符*补齐,使其与最长的字符串等长.ss所指字符串数组中共有M个字符串,且串长<N. //重难点 ...
- Wx-小程序-长按复制文本
view: <text bindlongtap='copy' data-name='{{name}}'>{{item.name}}</text> js: copy(e) { v ...
- linux 安装 Jenkins
yum的repo中默认没有Jenkins,需要先将Jenkins存储库添加到yum repos,执行下面的命令: wget -O /etc/yum.repos.d/jenkins.repo https ...
- C++中map的介绍用法以及Gym题目:Two Sequences
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字(key),每个关键字只能在map中出现一次,第二个可能称为该关键字的值(value))的数据 处理能力,由于这个特性,它完成有可能 ...
- 【C语言】输入一个正整数,判断其是否为素数
素数的定义: 素数(prime number)又称质数,有无限个. 素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为素数.代码1: #include<stdio.h& ...
- 获取 input type=file 上次文件的路径
可以通过 $('这个元素').val();得到全路径: