首页 > 其他分享 >Leetcode 65. 有效数字

Leetcode 65. 有效数字

时间:2024-09-23 13:23:27浏览次数:1  
标签:状态 定义 有效数字 INIT 整数 STATE 65 Leetcode

1.题目基本信息

1.1.题目描述

给定一个字符串 s ,返回 s 是否是一个 有效数字。

例如,下面的都是有效数字:”2″, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789″,而接下来的不是:”abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53″。

一般的,一个 有效数字 可以用以下的规则之一定义:

  • 一个 整数 后面跟着一个 可选指数。
  • 一个 十进制数 后面跟着一个 可选指数。
    一个 整数 定义为一个 可选符号 ‘-‘ 或 ‘+’ 后面跟着 数字。

一个 十进制数 定义为一个 可选符号 ‘-‘ 或 ‘+’ 后面跟着下述规则:

  • 数字 后跟着一个 小数点 .。
  • 数字 后跟着一个 小数点 . 再跟着 数位。
  • 一个 小数点 . 后跟着 数位。

指数 定义为指数符号 ‘e’ 或 ‘E’,后面跟着一个 整数。

数字 定义为一个或多个数位。

1.2.题目地址

https://leetcode.cn/problems/valid-number/description

2.解题方法

2.1.解题思路

状态机; 关键: 状态机的设计,即状态的定义+状态的转移函数

2.2.解题步骤

第一步,进行状态定义,并设计好状态转移图(这是最难也是最重要的一步,这步错了或者设计不合理,后面也就barbecue了)

第二步,初始化状态为INIT

第三步,进行遍历。根据当前状态+遍历的当前条件,进行当前状态的转移更新

3.解题代码

Python代码

class Solution:
    # 状态机; 关键: 状态的定义+状态的转移函数
    def isNumber(self, s: str) -> bool:
        # 第一步,进行状态定义,并设计好状态转移图(这是最难也是最重要的一步,这步错了或者设计不合理,后面也就barbecue了)
        # states=[
        #     "STATE_INIT",   # 初始状态
        #     "STATE_INT_SIGN", # 整数符号状态
        #     "STATE_INT",  # 整数状态
        #     "STATE_POINT",    # 左右整数的小数点状态
        #     "STATE_POINT_WITHOUT_LEFT_INT",   # 左无整数的小数点状态
        #     "STATE_FRACTION", # 小数状态
        #     "STATE_EXP",  # 指数状态
        #     "STATE_EXP_SIGN", # 指数后面的数字的符号状态
        #     "STATE_EXP_NUM",  # 指数的数字状态
        #     "STATE_END"   # 结束状态
        # ]
        # 第二步,初始化状态为INIT
        currentState="STATE_INIT"
        # 第三步,进行遍历。根据当前状态+遍历的当前条件,进行当前状态的转移更新
        for ch in s:
            if currentState=="STATE_INIT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                elif ch==".":
                    currentState="STATE_POINT_WITHOUT_LEFT_INT"
                elif ch=="+" or ch=="-":
                    currentState="STATE_INT_SIGN"
                else:
                    return False
            elif currentState=="STATE_INT_SIGN":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                elif ch==".":
                    currentState="STATE_POINT_WITHOUT_LEFT_INT"
                else:
                    return False
            elif currentState=="STATE_INT":
                if ch.lower()=="e":
                    currentState="STATE_EXP"
                elif ch==".":
                    currentState="STATE_POINT"
                elif ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_INT"
                else:
                    return False
            elif currentState=="STATE_POINT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                elif ch.lower()=="e":
                    currentState="STATE_EXP"
                else:
                    return False
            elif currentState=="STATE_POINT_WITHOUT_LEFT_INT":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                else:
                    return False
            elif currentState=="STATE_FRACTION":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_FRACTION"
                elif ch.lower()=="e":
                    currentState="STATE_EXP"
                else:
                    return False
            elif currentState=="STATE_EXP":
                if ch=="+" or ch=="-":
                    currentState="STATE_EXP_SIGN"
                elif ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            elif currentState=="STATE_EXP_SIGN":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            elif currentState=="STATE_EXP_NUM":
                if ord("0")<=ord(ch)<=ord("9"):
                    currentState="STATE_EXP_NUM"
                else:
                    return False
            else:
                return False
        if currentState in ["STATE_INT","STATE_FRACTION","STATE_EXP_NUM","STATE_POINT"]:
            currentState="STATE_END"
        # print(currentState)
        return currentState=="STATE_END"

4.执行结果

在这里插入图片描述

标签:状态,定义,有效数字,INIT,整数,STATE,65,Leetcode
From: https://www.cnblogs.com/geek0070/p/18426894

相关文章

  • 计算机低能儿从0刷leetcode | 11.盛最多水的容器
    题目:11.盛最多水的容器解答:不想暴力遍历,于是让右端点j从最右侧开始遍历,每次寻找离j最远、且高度不小于height[j]的左端点i,结果发现错误,比如[1,2]的情况。于是又打补丁,按同样思路左端点i从0开始遍历,每次寻找离i最远、且高度不小于height[i]的右端点j,结果正确,然而时间复杂度......
  • 数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点
    328.奇偶链表题目描述328.奇偶链表给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输......
  • 数据结构之线性表——LeetCode:80. 删除有序数组中的重复项 II,88. 合并两个有序数组,4.
    80.删除有序数组中的重复项II题目描述80.删除有序数组中的重复项II给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外......
  • 数据结构之线性表——LeetCode:82. 删除排序链表中的重复元素 II,21. 合并两个有序链
    82.删除排序链表中的重复元素II题目描述82.删除排序链表中的重复元素II给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。运行代码classSolution{public:ListNode*deleteDuplicates(ListNode......
  • LeetCode力扣——并查集:947. 移除最多的同行或同列石头,1971. 寻找图中是否存在路径,24
    947.移除最多的同行或同列石头题目描述947.移除最多的同行或同列石头n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其......
  • 408算法题leetcode--第11天
    3.无重复字符的最长子串3.无重复字符的最长子串思路:滑动窗口时间:O(n);空间:O(字符种类数)classSolution{public:intlengthOfLongestSubstring(strings){//滑动窗口:如果没有出现相同的字符,那么右指针一直向右intret=0,size=s.size();......
  • 408算法题leetcode--第九天
    344.反转字符串344.反转字符串思路:双指针时间:O(n);空间:O(1)classSolution{public:voidreverseString(vector<char>&s){intsize=s.size();for(inti=0,j=size-1;i<j;i++,j--){swap(s[i],s[j]);}......
  • Day 22 回溯法part04| LeetCode 491.递增子序列,46.全排列,47.全排列 II
    491.递增子序列491.非递减子序列classSolution{publicList<Integer>path=newLinkedList<>();publicList<List<Integer>>res=newArrayList<>();publicList<List<Integer>>findSubsequences(int[......
  • leetcode 算法题目学习笔记 - 序号2
    2.两数相加给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。可用的模板#include<iostream>#in......
  • (附源码)SSM 智慧小区管理系统 毕业设计06536
                                                              目录毕业设计摘 要Abstract第1章 前 言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章 相关技术2.1开发技术说明......