算法-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 " = ...
 
随机推荐
- 手把手教你做一个python+matplotlib的炫酷的数据可视化动图
			
1.效果图 2.注意: 上述资料是虚拟的,为了学习制作动图,构建的. 仅供学习, 不是真实数据,请别误传. 当自己需要对真实数据进行可视化时,可进行适当修改. 3.代码: #第1步:导出模块,固定 i ...
 - Linux - bash - 小坑: IFS
			
1. 概述 for 循环读取文件内容时, 输出被打得稀碎 2. 场景 需求 读入文件 逐行显示 源文件 Continuous Delivery with Docker and Jenkins Jenk ...
 - iOS开发之使用 infer静态代码扫描工具
			
infer是Facebook 的 Infer 是一个静态分析工具.可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题. 任何人都可以使用 infer 检测应用,可以将严重的 ...
 - 数据库持久化框架——MyBatis(1)
			
叨叨时刻:内容根据阿里云大学的MyBatis视频教程整理而成,有需要最好跟着视频教程走一遍 MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 ...
 - 关于AD元件的命名
			
1.电容 C? 10uf 2.电阻 R? 10k 3.芯片 U? STM32F103VET6 4.单排 J? SIP 5.三极管 Q? s8550 6.晶振 Y? 12M
 - HDU4081 Qin Shi Huang's National Road System
			
先求最小生成树 再遍历每一对顶点,如果该顶点之间的边属于最小生成树,则剪掉这对顶点在最小生成树里的最长路径 否则直接剪掉连接这对顶点的边~ 用prim算法求最小生成树最长路径的模板~ #include ...
 - pthon中的基本运算
			
格式化输出的三种方式 1.占位符 程序中经常会有这样的场景:要求用户输入信息,然后打印成固定的格式 比如要求用户输入用户名和年龄,然后打印如下格式: my name is xxx,my age is ...
 - cas的单点登录实现
			
1. 前提条件 环境:jdk1.8.shiro1.4.0及以上版本.项目以 spring+shiro构建 工具:buji-pac4j-3.1.0-jar-with-dependencies.jar以 ...
 - 基于SILVACO ATLAS的a-IGZO薄膜晶体管二维器件仿真(08)
			
进展比较慢啊... 根据江南大学硕士论文IGZO/IZO双有源层薄膜晶体管特性的模拟研究: 其中, gCBa:类受主导带尾态 gVBd:类施主价带尾态 gGd:类施主氧空位态 NDeep:价带尾深施主 ...
 - 洛谷 P1063 能量项链(区间DP)
			
嗯... 题目链接:https://www.luogu.com.cn/problem/P1063 这道题首先要读懂题目,然后往上套区间dp,要转换成链式. AC代码: #include<cstd ...