剑指offer 31. 表示数值的字符串-java版本
Acwing 31. 表示数值的字符串-java版本
原题链接
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100",“5e2”,“-123”,“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
注意:
小数可以没有整数部分,例如.123等于0.123;
小数点后面可以没有数字,例如233.等于233.0;
小数点前面和后面可以有数字,例如233.666;
当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
数据范围
输入字符串长度 [0,25]。
字符串中不含空格。
代码案例:输入: “0”
输出: true
题解
(模拟,字符串处理) O(n)O(n)
先去除行首和行尾空格;
行首如果有一个正负号,直接忽略;
如果字符串为空或只有一个’.',则不是一个合法数;
循环整个字符串,去掉以下几种情况:
(1) '.'或’e’多于1个;
(2) '.‘在’e’后面出现;
(3) ‘e’后面或前面为空,或者’e’前面紧跟着’.’;
(4) 'e’后面紧跟着正负号,但正负号后面为空;
剩下的情况都合法;
时间复杂度分析:整个字符串只遍历一遍,所以时间复杂度是 O(n) 。
class Solution {
public boolean isNumber(String s) {
int i = 0;
//首先先判断字符串是否有空格
while (i < s.length() && s.charAt(i) == ' ') i ++ ;
int j = s.length() - 1;
while (j >= 0 && s.charAt(j) == ' ') j -- ;
if (i > j) return false;
s = s.substring(i, j +1 );
//忽略前面的正负号
if (s.charAt(0) == '-' || s.charAt(0) == '+') s = s.substring(1);
if (s.isEmpty() || s.charAt(0)== '.' && s.length() == 1) return false;
int dot = 0, e = 0;//.和e的个数
for ( i = 0; i < s.length(); i ++ )
{
if (s.charAt(i) >= '0' && s.charAt(i) <= '9');//如果是正常的数 直接不管
else if (s.charAt(i) == '.')//是点数的话
{
dot ++ ;
if (e !=0 || dot > 1) return false;//.要是多余1个的话 返回假
}
else if (s.charAt(i) == 'e' || s.charAt(i) == 'E')//当有e出现的时候
{
e ++ ;
// e后面不能为空 不能第一个是e e的个数不能大于1 后面也不能为点 .e不能连着
if (i + 1 == s.length() || i== 0 || e > 1 || i == 1 && s.charAt(0) == '.') return false;
if (s.charAt(i+1) == '+' || s.charAt(i+1)== '-')//e后面要是有+-号的出现
{
if (i + 2 == s.length()) return false;//i+2要有数
i ++ ;
}
}
else return false;
}
return true;
}
}
偷懒的写法
class Solution {
public boolean isNumber(String s) {
try{
new Double(s);
return true;
}catch(Exception e){
return false;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)