目录
题目地址:
我们直接看题解吧:
难度分析:
解题方法:
审题目+事例+提示:
解题思路:
代码实现:
题目地址:
LCR 138. 有效数字 - 力扣(LeetCode)
难度:中等
今天刷有效数字(表示数值的字符串),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
难度分析:
这道题难倒是不算难,主要比较繁杂,因为要找出它的各种情况状态。
解题方法:
方法1、逐位判断(按顺序扫描字符串)
方法2、正则表达式(不太建议,面试用不上)
审题目+事例+提示:
1、本题即允许字符串首末两端有一些额外的空格
2、表示数值的字符串遵循共同的模式:
A[.[B]][e|EC]或者.B[e|EC]。
以上模式的含义是:
A为数值的整数部分,B为跟在小数点之后的小数部分,C为跟在e或者E之后的指数部分。
其中,A部分可以没有,比如小数.123代表0.123。但如果一个数没有整数部分,那么小数部分必须有。
具体来说:
A和C(也就是整数部分和指数部分)都是可能以"+"、"-"开头或者没有符号的数字串,
B是数字序列,但前面不能有符号。
解题思路:
1、设置三个boolean类型的变量,初始化为false
2、循环遍历字符串进行判断:
‘.’出现的正确情况:只出现一次,且在e的前面
‘e’出现的正确情况:只出现一次,且出现前有数字
‘+’,’-’出现的正确情况:只能出现在开头和e的后一位
符合条件的的字符重新置为true
3、返回对应的布尔值
代码实现:
class Solution {public boolean isNumber(String s) {if (s == null || s.length() == 0) return false; //首先判断字符串是否为空 s = s.trim();//去掉字符串两端的空格boolean numFlag = false;boolean dotFlag = false; //设置三个变量,初始化falseboolean eFlag = false;for (int i = 0; i < s.length(); i++) {//判定是否为数字,则标记numFlagif (s.charAt(i) >= '0' && s.charAt(i) <= '9') {numFlag = true;}//判定是否为. 需要没出现过.并且没出现过eelse if (s.charAt(i) == '.' && !dotFlag && !eFlag) {dotFlag = true;} //判定是否为e,需要没出现过e,并且出过数字了else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eFlag && numFlag) {eFlag = true;numFlag = false;//为了避免123e这种情况,出现e之后就标志重置为false} //判定为+-符号,只能出现在第一位或者紧接e后面else if ( (s.charAt(i) == '+' || s.charAt(i) == '-') {//+-出现在0位置或者e/E的后面第一个位置才是合法的if(i != 0 && str[i-1] != 'e' && str[i-1] != 'E'){return false;}} //其他情况,都是非法的else {return false;}}return numFlag;}
}