位置 帝国网站管理系统>职场>笔试面试>LeetCode

65.有效数字

65.有效数字
65.有效数字
65.有效数字
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/