有效数字这一题可以使用模拟的方式来解决,有效易懂。
class Solution {
/*借鉴了题解区三叶姐的模拟思路 非常清晰易懂
将字符串以 e/E 进行分割后,其实规则十分简单:
如果存在 e/E :左侧可以「整数」或「浮点数」,右侧必须是「整数」
如果不存在 e/E :整段可以是「整数」或「浮点数」
关键在于如何实现一个 check 函数用于判断「整数」或「浮点数」:
+/- 只能出现在头部
. 最多出现一次
至少存在一个数字 */
public boolean isNumber(String s) {
char[] num=s.toCharArray();
int indexE=-1;
for(int i=0;i<num.length;i++){
//有字母e/E且第一次出现
if((num[i]=='e'||num[i]=='E')&&(indexE==-1))
indexE=i;
//有字母e/E且不是第一次出现
else if((num[i]=='e'||num[i]=='E')&&(indexE==-1))
return false;
//没有字母e不做处理 留到后面判断整数或者小数即可
}
//整个字符串没有字母e/E
if(indexE==-1)
return check(num,0,num.length-1,false);
boolean ansLeft=true,ansRight=true;
if(indexE!=-1){
ansLeft=check(num,0,indexE-1,false);
ansRight=check(num,indexE+1,num.length-1,true);
}
return ansLeft&ansRight;
}
//type:true 必须为整数 false 整数小数均可
public boolean check(char[] nums,int start,int end,boolean type){
boolean haveDot=false;
boolean haveNum=false;
if(end<start)return false;
if(nums[start]=='+'||nums[start]=='-') start++;
for(int i=start;i<=end;i++){
if(nums[i]=='.'){
if(type||haveDot) return false;
haveDot=true;
}
//是数字
else if(nums[i]>='0'&&nums[i]<='9')
haveNum=true;
//是其他字母
else
return false;
}
return haveNum;
}
}```