算法的学习笔记—表示数值的字符串(牛客JZ20)
😀前言
在编程中,判断一个字符串是否可以表示数值是一个常见的需求,特别是在处理用户输入、数据验证以及解析复杂字符串时。这篇文章将介绍如何使用正则表达式来判断一个字符串是否表示数值,包括科学计数法、小数和整数。
表示数值的字符串
😁题目描述
请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。
😍数值表示的几种形式
在深入探讨解决方案之前,我们先了解一下数值在字符串中的几种表示形式:
🤨1. 整数:
- 整数可能以正号
+
、负号-
开头,也可以没有符号。 - 整数部分必须包含至少一个数字,例如
"123"
、"-456"
、"+789"
。
🤨2. 小数:
- 小数可以有符号或无符号。
- 小数有以下几种情况:
- 整数部分加上小数点,例如
"123."
。 - 整数部分加上小数点和小数部分,例如
"123.45"
。 - 仅包含小数点和小数部分,例如
".45"
。
- 整数部分加上小数点,例如
🤨3. 科学计数法:
- 科学计数法由一个数字部分和一个以
e
或E
开头的指数部分组成。 - 例如,
"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 <= str.length <= 25
-
str 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。
-
如果怀疑用例是不是能表示为数值的,可以使用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+)?
:表示科学计数法中的指数部分,可以有,也可以没有。指数部分必须以e
或E
开头,可以带有符号并且后面跟随至少一个数字。
💗进阶分析
这个算法的时间复杂度为O(n)
,因为字符串的每个字符只会被扫描一次。空间复杂度也是O(n)
,因为正则表达式会为匹配操作分配一定的空间。
💗示例说明
通过这个方法,可以验证以下字符串:
true
的情况:"+100"
、"5e2"
、"-123"
、"3.1416"
、"-1E-16"
false
的情况:"12e"
、"1a3.14"
、"1.2.3"
、"+-5"
、"12e+4.3"
😄总结
通过本文的讲解,我们学习了如何使用正则表达式来判断字符串是否表示数值。这个方法简单且高效,能够处理大多数常见的数值表示形式。掌握这个技能,可以帮助我们在实际编程中更好地处理数据输入、解析和验证等任务。
- 点赞
- 收藏
- 关注作者
评论(0)