LeetCode 题目 66:加一【python5种算法实现】

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
欢迎加入社区:码上找工作
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅
python数据分析可视化:企业实战案例
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

题目描述

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

例如:

  • “0” => true
  • “0.1” => true
  • “abc” => false
  • “1 a” => false
  • “2e10” => true
  • " -90e3 " => true
  • " 1e" => false
  • “e3” => false
  • " 6e-1" => true
  • " 99e2.5 " => false
  • “53.5e93” => true
  • " --6 " => false
  • “-+3” => false
  • “95a54e53” => false

说明: 我们考虑在 ASCII 字符集中的空白字符,非负整数和小数。

输入格式
  • s:一个字符串。
输出格式
  • 返回一个布尔值,表示是否为有效的十进制数字。

方法一:有限状态自动机(Finite State Automaton, FSA)

解题步骤
  1. 定义状态:创建状态转换表,包括接受数字、符号、小数点、指数符号等状态。
  2. 初始化状态:初始状态设定为 start
  3. 状态转移:根据当前字符和状态转换表更新状态。
  4. 终止检查:最终状态在接受状态集合中,则返回 true;否则返回 false
完整的规范代码
def isNumber(s):"""使用有限状态自动机(FSA)方法判断字符串是否为有效的十进制数字:param s: str, 输入字符串:return: bool, 是否为有效的十进制数字"""state = 0finals = [0, 0, 0, 1, 0, 1, 1, 0, 1]  # 有效终止状态transitionTable = [[0, 1, 6, 2, -1, -1],   # state 0[-1, -1, 6, 2, -1, -1],  # state 1[-1, -1, 3, -1, -1, -1], # state 2[8, -1, 3, -1, 4, -1],   # state 3[-1, 7, 5, -1, -1, -1],  # state 4[8, -1, 5, -1, -1, -1],  # state 5[8, -1, 6, 3, 4, -1],    # state 6[-1, -1, 5, -1, -1, -1], # state 7[8, -1, -1, -1, -1, -1]  # state 8]# Input classes: [invalid, '+/-', 'number', '.', 'e/E', 'other']def inputType(c):if c == ' ':return 0if c in '+-':return 1if c.isdigit():return 2if c == '.':return 3if c in 'eE':return 4return 5for c in s.strip():state = transitionTable[state][inputType(c)]if state == -1:return Falsereturn finals[state] == 1# 示例调用
print(isNumber("0"))  # 输出: True
print(isNumber("0.1"))  # 输出: True
print(isNumber("abc"))  # 输出: False
print(isNumber("1 a"))  # 输出: False
print(isNumber("2e10"))  # 输出: True
print(isNumber(" -90e3 "))  # 输出: True
print(isNumber("1e"))  # 输出: False
print(isNumber("e3"))  # 输出: False
print(isNumber("6e-1"))  # 输出: True
print(isNumber("99e2.5"))  # 输出: False
print(isNumber("53.5e93"))  # 输出: True
print(isNumber("--6"))  # 输出: False
print(isNumber("-+3"))  # 输出: False
print(isNumber("95a54e53"))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),只需要遍历字符串一次。
  • 空间复杂度:(O(1)),状态转换表的大小是常数。

方法二:正则表达式

解题步骤
  1. 定义正则表达式:使用正则表达式匹配可能的数字模式。
  2. 模式匹配:使用 Python 的 re 模块来检查字符串是否符合定义的正则表达式。
完整的规范代码
import redef isNumber(s):"""使用正则表达式判断字符串是否为有效的十进制数字:param s: str, 输入字符串:return: bool, 是否为有效的十进制数字"""pattern = r'^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$'return re.match(pattern, s.strip()) is not None# 示例调用
print(isNumber("0"))  # 输出: True
print(isNumber("0.1"))  # 输出: True
print(isNumber("abc"))  # 输出: False
print(isNumber("1 a"))  # 输出: False
print(isNumber("2e10"))  # 输出: True
print(isNumber(" -90e3 "))  # 输出: True
print(isNumber("1e"))  # 输出: False
print(isNumber("e3"))  # 输出: False
print(isNumber("6e-1"))  # 输出: True
print(isNumber("99e2.5"))  # 输出: False
print(isNumber("53.5e93"))  # 输出: True
print(isNumber("--6"))  # 输出: False
print(isNumber("-+3"))  # 输出: False
print(isNumber("95a54e53"))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),正则表达式的匹配时间通常与字符串长度线性相关。
  • 空间复杂度:(O(1)),正则表达式的空间占用是常数。

方法三:分情况讨论

解题步骤
  1. 逐字符分析:逐个分析字符串中的字符,根据数字、小数点、指数部分、符号等进行分类处理。
  2. 状态标记:使用标志位记录是否出现过数字、小数点、指数等,以正确处理各种情况。
完整的规范代码
def isNumber(s):"""分情况讨论法判断字符串是否为有效的十进制数字:param s: str, 输入字符串:return: bool, 是否为有效的十进制数字"""s = s.strip()if not s:return Falsenumeric = Falsedecimal = Falseexponent = Falsei = 0# 处理符号if s[0] in "+-":i += 1while i < len(s):if s[i].isdigit():numeric = Trueelif s[i] == '.':if decimal or exponent:return Falsedecimal = Trueelif s[i] in "eE":if exponent or not numeric:return Falseexponent = Truenumeric = False  # 需要在e之后看到数字decimal = False  # 防止e之后出现小数点if i + 1 < len(s) and s[i+1] in "+-":i += 1else:return Falsei += 1return numeric# 示例调用
print(isNumber("0"))  # 输出: True
print(isNumber("0.1"))  # 输出: True
print(isNumber("abc"))  # 输出: False
print(isNumber("1 a"))  # 输出: False
print(isNumber("2e10"))  # 输出: True
print(isNumber(" -90e3 "))  # 输出: True
print(isNumber("1e"))  # 输出: False
print(isNumber("e3"))  # 输出: False
print(isNumber("6e-1"))  # 输出: True
print(isNumber("99e2.5"))  # 输出: False
print(isNumber("53.5e93"))  # 输出: True
print(isNumber("--6"))  # 输出: False
print(isNumber("-+3"))  # 输出: False
print(isNumber("95a54e53"))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),需要遍历整个字符串。
  • 空间复杂度:(O(1)),只使用了几个辅助变量。### 方法四:逐步细化条件的处理
解题步骤
  1. 初始化变量:定义几个变量来标识数字状态,如是否遇到数字、小数点、指数等。
  2. 遍历字符串:逐字符检查,并根据字符类型(数字、小数点、指数、符号)更新状态。
  3. 后续验证:遍历结束后,根据标记的状态判断字符串是否符合数字格式。
完整的规范代码
def isNumber(s):"""逐步细化条件处理法判断字符串是否为有效的十进制数字:param s: str, 输入字符串:return: bool, 是否为有效的十进制数字"""s = s.strip()num, dot, exp, numAfterE = False, False, False, Falsefor i, char in enumerate(s):if char.isdigit():num = TruenumAfterE = Trueelif char == '.':if dot or exp:return Falsedot = Trueelif char in "eE":if exp or not num:return Falseexp = TruenumAfterE = Falseelif char in "+-":if i > 0 and s[i-1] not in "eE":return Falseelse:return Falsereturn num and numAfterE# 示例调用
print(isNumber("0"))  # 输出: True
print(isNumber("0.1"))  # 输出: True
print(isNumber("abc"))  # 输出: False
print(isNumber("1 a"))  # 输出: False
print(isNumber("2e10"))  # 输出: True
print(isNumber(" -90e3 "))  # 输出: True
print(isNumber("1e"))  # 输出: False
print(isNumber("e3"))  # 输出: False
print(isNumber("6e-1"))  # 输出: True
print(isNumber("99e2.5"))  # 输出: False
print(isNumber("53.5e93"))  # 输出: True
print(isNumber("--6"))  # 输出: False
print(isNumber("-+3"))  # 输出: False
print(isNumber("95a54e53"))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),需要遍历整个字符串一次。
  • 空间复杂度:(O(1)),使用固定数量的标记变量。

方法五:分割加验证法

解题步骤
  1. 分割处理:首先检查并处理可能的空格,然后分割处理可能的指数部分。
  2. 验证各部分:单独验证整数/小数部分和指数部分的合法性。
  3. 组合结果:确保整数/小数部分和指数部分均合法。
完整的规范代码
def isNumber(s):"""分割加验证法判断字符串是否为有效的十进制数字:param s: str, 输入字符串:return: bool, 是否为有效的十进制数字"""s = s.strip()if 'e' in s or 'E' in s:parts = s.split('e') if 'e' in s else s.split('E')if len(parts) != 2:return Falseleft, right = partsreturn (isDecimal(left) or isInteger(left)) and isInteger(right)else:return isDecimal(s) or isInteger(s)def isDecimal(part):if not part or (part[0] in '+-' and len(part) == 1):return Falsepart = part[1:] if part[0] in '+-' else partdot_seen = Falsenum_seen = Falsefor char in part:if char.isdigit():num_seen = Trueelif char == '.':if dot_seen:return Falsedot_seen = Trueelse:return Falsereturn num_seendef isInteger(part):if not part:return Falsepart = part[1:] if part[0] in '+-' else partreturn part.isdigit()# 示例调用
print(isNumber("0"))  # 输出: True
print(isNumber("0.1"))  # 输出: True
print(isNumber("abc"))  # 输出: False
print(isNumber("1 a"))  # 输出: False
print(isNumber("2e10"))  # 输出: True
print(isNumber(" -90e3 "))  # 输出: True
print(isNumber("1e"))  # 输出: False
print(isNumber("e3"))  # 输出: False
print(isNumber("6e-1"))  # 输出: True
print(isNumber("99e2.5"))  # 输出: False
print(isNumber("53.5e93"))  # 输出: True
print(isNumber("--6"))  # 输出: False
print(isNumber("-+3"))  # 输出: False
print(isNumber("95a54e53"))  # 输出: False
算法分析
  • 时间复杂度:(O(n)),分割和验证各部分总共需要遍历字符串一次或多次。
  • 空间复杂度:(O(1)),除了输入字符串外,使用了有限的额外空间。

不同算法的优劣势对比

特征方法一: FSA方法二: 正则表达式方法三: 分情况讨论方法四: 逐步细化方法五: 分割加验证
时间复杂度(O(n))(O(n))(O(n))(O(n))(O(n))
空间复杂度(O(1))(O(1))(O(1))(O(1))(O(1))
优势明确状态转换,结构清晰快速匹配,代码简洁直观易理解,适用于多条件状态清晰,逻辑简单灵活处理复杂格式,模块化验证
劣势状态表较复杂,需要细心设计正则表达式复杂难以维护条件多,代码冗长多条件判断,容易出错分割处理复杂,容易遗漏情况

应用示例

数据验证系统
在数据导入和处理系统中,有效数字的验证是常见需求,特别是在处理来自不同来源的大量数据时。通过这些算法,系统能够确保数据的格式正确性,避免在后续的数据分析和计算中出现错误。这些方法可以应用于数据库数据清洗、科学计算输入验证等场景,提高系统的鲁棒性和数据处理的准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2895.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

抖音 小程序 获取手机号 报错 getPhoneNumber:fail auth deny

这是因为 当前小程序没有获取 手机号的 权限 此能力仅支持小程序通过试运营期后可用&#xff0c;默认获取权限&#xff0c;无需申请&#xff1b; https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/guide/open-capabilities/acquire-phone-number-acqu…

Redis入门到通关之Redis网络模型-用户空间和内核态空间

文章目录 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&#xff1a; 在我的…

DevOps(十三)Jenkins之Selenium插件配置

一、Selenium Grid详细介绍 Selenium Grid 是 Selenium 测试套件的一部分&#xff0c;主要用于通过并行执行测试来提高测试执行的速度和效率。它允许您在多个环境&#xff08;不同的浏览器和操作系统&#xff09;上同时运行测试&#xff0c;从而帮助在开发过程中快速发现跨浏览…

Github 2024-04-25Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revised” Lic…

spark3.0.0单机模式安装

注&#xff1a;此安装教程基于hadoop3集群版本 下载安装包 下载spark3.0.0版本&#xff0c;hadoop和spark版本要对应&#xff0c;否则会不兼容 用xftp上传Linux虚拟机&#xff0c;上传目录/bigdata&#xff08;可修改&#xff09; 解压 tar -zxvf /bigdata/spark-3.0.0-bin-h…

背包问题汇总

本文涉及知识点 动态规划汇总 状态机dp 01背包 有n件物品&#xff0c;体积分别是v[i]&#xff0c;价值分别是w[i]&#xff0c;有个包的容积是bv。如何选择物品使得&#xff0c;在总体积不超过vb的前提下&#xff0c;让总价值最大。 动态规划的状态表示 dp[i][j] 表示处理完…

go垃圾回收机制

Go 语言的垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制是其内存管理的核心部分&#xff0c;它负责自动检测并回收不再使用的内存。Go 的垃圾回收机制可以分为以下几个主要类别&#xff1a; 1. 标记&#xff08;Mark&#xff09; 根节点&#xff1a;垃圾回收从…

适用于WPF模式开发的主题和控件库Material Design

简介: MaterialDesignInXamlToolkit 是一个开源的 GUI 库,它提供了 Google Material Design 风格的 GUI 元素,可以在 .NET Framework 和 .NET Core 上使用。它的目的是帮助 .NET 开发人员快速构建具有现代化外观的应用程序。 MaterialDesignInXamlToolkit 包含了许多常用的…

CentOS 7.9.2009 中 Docker 使用 GPU

一、安装nvidia驱动 1.1&#xff0c;查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2&#xff0c;进入 PCI devices &#xff0c;输入上一步查询到的 2204 1.3&#xff0c;进入 官方驱动 | NVIDIA&#xff0c;查询 Geforce RTX 3090 驱动并下载 1.4&#xff0c;禁用…

冯老师降维打击申论课

冯老师降维打击申论课&#xff0c;以其独到的见解和精湛的教学技巧&#xff0c;将复杂的申论知识变得简单易懂。通过深入浅出的讲解&#xff0c;帮助考生迅速掌握申论精髓&#xff0c;轻松应对考试。课程内容丰富实用&#xff0c;深受考生好评&#xff0c;是备考申论的不二之选…

【SQL代理中转注入】对DVWA登录界面username字段实施注入

一、实验过程 步骤0&#xff1a;注释掉相关username防护&#xff0c;截图如下&#xff1a; 以DVWA为攻击目标&#xff0c;将login.php中第21、22行注释掉 步骤1&#xff1a;源码分析&#xff0c;截图如下&#xff1a; 如此可知&#xff0c;首先需要通过token验证&#xff0c;然…

CTFHub(web sql)(四)

Cookie注入 Cookie 注入的原理也和其他注入一样&#xff0c;只不过是将提交的参数已 Cookie 方式提交&#xff0c;而一般的注入是使用 GET 或者 POST 方式提交&#xff0c;GET 方式提交就是直接在网址后面加上需要注入的语句&#xff0c;POST 方式则是通过表单&#xff0c;GET …

feign整合sentinel做降级知识点

1&#xff0c;配置依赖 <!-- Feign远程调用依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> <!--sentinel--><dependency>…

【数据结构(邓俊辉)学习笔记】向量04——有序向量

文章目录 0.概述1.比较器2.有序性甄别3.唯一化3.1低效算法3.1.1实现3.1.2 复杂度3.1.3 改进思路3.2 高效算法3.2.1 实现3.2.2 复杂度 4.查找4.1统一接口4.2 语义定义4.3 二分查找4.3.1 原理4.3.2 实现4.3.3 复杂度4.3.4 查找长度4.3.5 不足 4.4 Fibonacci查找4.4.1 思路及原理4…

【03-掌握Scikit-learn:深入机器学习的实用技术】

文章目录 前言数据预处理缺失值处理数据缩放特征选择模型训练参数调整模型评估总结前言 经过了对Python和Scikit-learn的基础安装及简单应用,我们现在将更深入地探究Scikit-learn的实用技术,以进一步提升我们的数据科学技能。在本文中,我们将涵盖数据预处理、特征选择、模型…

探索 VisionOS 辅助功能:VoiceOver 手势

当继续探索 VisionOS 时,一直在深入研究其辅助功能,特别是 VoiceOver。 VoiceOver 是一款基于手势的屏幕阅读器,让您无需看屏幕即可享受使用设备的乐趣。这对于基于视觉的设备非常重要,这样每个人都可以使用 Apple Vision Pro,无论其视觉能力如何。 Apple 一直在努力支持…

Qt中的 tableView 设置 二进制 十六进制 序号表头

二 进制序号 因为QTableView的垂直表头并不支持使用委托来自定义。 相反&#xff0c;可以通过将自定义的QWidget作为QHeaderView的标签来实现这一目标。 代码&#xff1a; #include <QApplication> #include <QMainWindow> #include <QVBoxLayout> #include …

反射 - - - - - - - - 内省【精细】

1、概念 Java内省机制&#xff08;Introspection&#xff09;是一种访问Java Bean属性的方式&#xff0c;它允许程序在运行时获取和设置Java对象的属性。通过内省机制&#xff0c;程序可以在运行时获取对象的属性名、类型和值&#xff0c;并动态地设置对象的属性值。内省机制为…

骑砍2霸主MOD开发(8)-action_sets.xml骨骼动画

一.action_sets.xml 1.文件目录:Modules\Native\ModuleData\action_sets.xml 2.action_set(骨骼动画animation) action1 action2 action3 3.通过在action_set中配置skeleton,人,马匹,牛,羊等骨架 二.使用编辑器修改动作 三.骨架&骨骼&骨骼动画 1.骨架skeleton Skele…

企业微信hook接口协议,根据手机号搜索联系人

根据手机号搜索联系人 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","phoneNumber":"1357xxxx" } 返回示例 {"data&q…