65.有效数字
65. 有效数字
题意
有效数字(按顺序)可以分成以下几个部分:
1. 一个 小数 或者 整数
2. (可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
1. (可选)一个符号字符('+' 或 '-')
2. 下述格式之一:
1. 至少一位数字,后面跟着一个点 '.'
2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
3. 一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
1. (可选)一个符号字符('+' 或 '-')
2. 至少一位数字
部分有效数字列举如下:["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"]
给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。
难度
困难
示例
示例 1:
输入:s = "0"
输出:true
示例 2:
输入:s = "e"
输出:false
示例 2:
输入:s = "."
输出:false
分析
看着这么多的限制条件,是不是一下子就被冲昏了头?
别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点
点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。
判断有效数字,我们先从最基础的开始——判断是否是整数。
要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:
1. 至少有一位数字
2. 可以有一个符号('+' 或 '-')
3. 不存在任何数字以外的其他字符
这样子我们就可以写出如下的代码:
boolean isInteger(String str){
boolean haveNum = false;
for(int i = 0;i < str.length();i++){
if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){
continue;
}
if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){
haveNum = true;
}
else
return false;
}
return haveNum;
}
下一步就是判断小数了,我们照样可以提炼出几个要素:
1. 要有小数点.
2. 小数点前后至少得有一边有数字
3. 可以有一个符号('+' 或 '-')
4. 不存在任何数字以外的其他字符
这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改
造,便可以得出一个用来判断是否为数字的方法了。
boolean isNum(String str,boolean mustInt){
boolean haveDot = false,haveNum = false;
for(int i = 0;i < str.length();i++){
if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){
continue;
}
if(str.charAt(i) == '.'){
if(haveDot || mustInt)
return false;
haveDot = true;
}
else
if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){
haveNum = true;
}
else
return false;
}
return haveNum;
}
这时候就只剩下了这个 E 的问题了,不慌,我们继续分析。
如果没有 E 的话,那么我们只需要判断整个字符串是否为整数或者小数即可。
如果有的话,我们则根据 E 的位置将整个字符串分成两块,一块是 E 前面的,这部分可
以是整数也可以是小数,也可以没有,另外一块则是 E 后面的,这部分的话,必须是整
数。
这样子我们就把整个模拟的过程给理顺了:
class Solution {
public boolean isNumber(String s) {
int size = s.length();
int ePos = -1;
for(int i = 0;i < size;i++){
boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e';
if(b && ePos == -1){
ePos = i;
continue;
}
else if(b){
return false;
}
}
if(ePos == -1 || ePos == 0){
return isNum(s,false);
}
else{
return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos +
1),true);
}
}
private boolean isNum(String str,boolean mustInt){
boolean haveDot = false,haveNum = false;
for(int i = 0;i < str.length();i++){
if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){
continue;
}
if(str.charAt(i) == '.'){
if(haveDot || mustInt)
return false;
haveDot = true;
}
else
if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){
haveNum = true;
}
else
return false;
}
return haveNum;
}
}
1669877268676-f1d92c38-d85e-4ffa-824d-bb20097f29eb.png
总结
其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如
此。
力扣链接:https://leetcode.cn/problems/valid-number/