算法的学习笔记—表示数值的字符串(牛客JZ20)

举报
尘觉 发表于 2024/08/15 11:18:13 2024/08/15
【摘要】 在编程中,判断一个字符串是否可以表示数值是一个常见的需求,特别是在处理用户输入、数据验证以及解析复杂字符串时。这篇文章将介绍如何使用正则表达式来判断一个字符串是否表示数值,包括科学计数法、小数和整数。

😀前言
在编程中,判断一个字符串是否可以表示数值是一个常见的需求,特别是在处理用户输入、数据验证以及解析复杂字符串时。这篇文章将介绍如何使用正则表达式来判断一个字符串是否表示数值,包括科学计数法、小数和整数。

表示数值的字符串

牛客网

😁题目描述

请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。

😍数值表示的几种形式

在深入探讨解决方案之前,我们先了解一下数值在字符串中的几种表示形式:

🤨1. 整数:

  • 整数可能以正号+、负号-开头,也可以没有符号。
  • 整数部分必须包含至少一个数字,例如"123""-456""+789"

🤨2. 小数:

  • 小数可以有符号或无符号。
  • 小数有以下几种情况:
    1. 整数部分加上小数点,例如"123."
    2. 整数部分加上小数点和小数部分,例如"123.45"
    3. 仅包含小数点和小数部分,例如".45"

🤨3. 科学计数法:

  • 科学计数法由一个数字部分和一个以eE开头的指数部分组成。
  • 例如,"1.23e10"表示1.23 * 10^10"-5E-2"表示-5 * 10^-2

在处理这些表示形式时,还需要注意字符串前后的空格,它们不会影响数值的有效性。

😉例如:

字符串["+100",“5e2”,"-123",“3.1416”,"-1E-16"]都表示数值。

但是[“12e”,“1a3.14”,“1.2.3”,“±5”,“12e+4.3”]都不是数值。

😊提示:

  1. 1 <= str.length <= 25

  2. str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。

  3. 如果怀疑用例是不是能表示为数值的,可以使用python的print(float(str))去查看

进阶:时间复杂度O(n) ,空间复杂度O(n)

😁示例

示例1

输入:“123.45e+6”
返回值:true

示例2

输入:“1.2.3”
返回值:false

示例3

输入:"."
返回值:false

示例4

输入:" .2 "
返回值:true

😀解题思路

使用正则表达式进行匹配。

[]  : 字符集合
()  : 分组
?   : 重复 0 ~ 1 次
+   : 重复 1 ~ n 次
*   : 重复 0 ~ n 次
.   : 任意字符
\\. : 转义后的 .
\\d : 数字
public boolean isNumeric (String str) {
    if (str == null || str.length() == 0)
        return false;
    return new String(str).matches("[+-]?\\d*(\\.\\d+)?([eE][+-]?\\d+)?");
}

这个正则表达式的工作原理如下:

  • [+-]?:表示可选的符号部分,可以是+-,也可以没有。
  • \\d*:表示整数部分,可以是0个或多个数字。
  • (\\.\\d+)?:表示小数部分,可以是一个小数点后跟随至少一个数字,或没有小数部分。
  • ([eE][+-]?\\d+)?:表示科学计数法中的指数部分,可以有,也可以没有。指数部分必须以eE开头,可以带有符号并且后面跟随至少一个数字。

💗进阶分析

这个算法的时间复杂度为O(n),因为字符串的每个字符只会被扫描一次。空间复杂度也是O(n),因为正则表达式会为匹配操作分配一定的空间。

💗示例说明

通过这个方法,可以验证以下字符串:

  • true 的情况:"+100""5e2""-123""3.1416""-1E-16"
  • false 的情况:"12e""1a3.14""1.2.3""+-5""12e+4.3"

😄总结

通过本文的讲解,我们学习了如何使用正则表达式来判断字符串是否表示数值。这个方法简单且高效,能够处理大多数常见的数值表示形式。掌握这个技能,可以帮助我们在实际编程中更好地处理数据输入、解析和验证等任务。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。