AcWing 31. 表示数值的字符串
原题链接
困难
作者:
lhsjohn
,
2019-06-18 00:06:05
,
所有人可见
,
阅读 1219
题目描述
class Solution {
int index = 0;
//123.45e+6
//符合A[.[B]][e|EC] 或者.B[e|EC] 格式的都可以
//A 和 C 都可能是以"+" 或者 "-"开头的0~9位的数字
//B也是0-9的数位串 但前面不可以有正负号
public boolean isNumber(String s) {
if(s==null || s.equals("")) return false;
boolean numeric = scanInteger(s);
if(index>= s.length()){
return numeric;
}
//如果出现 "." 则接下来是小数的部分
if(s.charAt(index)=='.'){
index++;
//下面一行代码用||的原因
//1.小数点后可以没有整数部分 例如.123等于0.123
//2.小数点后面可以没有数字 例如233. 等于233.0
//3.小数点前面和后面也可以都有数字233.123
numeric = scanUnsignedNumber(s) || numeric;
}
if(index>= s.length()){
return numeric;
}
if(s.charAt(index)=='e' || s.charAt(index)=='E'){
index++;
//下面一行代码用&&的原因
//1.当e或者E前面没有数字时,整个字符串无法表示数字 例如.e1 e1
//2.当e或者E后面没有数字的时候,整个字符串无法表示数字 例如 12e 、12e.54
//前面必须合法并且e或者E的后面应该是不含符号的数字
numeric = numeric && scanInteger(s);
}
return numeric && index >= s.length();
}
boolean scanInteger(String s){
if (index>= s.length()){
return false;
}
if(s.charAt(index)=='+' || s.charAt(index)=='-'){
index++;
}
return scanUnsignedNumber(s);
}
boolean scanUnsignedNumber(String s){
int before = index;
while(index<=s.length()-1&& s.charAt(index)>='0' && s.charAt(index)<='9'){
index++;
}
return index > before;
}
}