本题思路不难,就是需要注意细节,各种恶心的测试用例都有涉及。需要注意如下几点:
1.±号只能出现在数字最开始或者e/E后面,不能出现在数字之间。
2.空格只能出现在字符串的开头和结尾,中间的空格是不允许的。
3.’.‘只能出现在e/E之前,不能出现在其后面。
4.e/E出现在数字后面,且不能出现在结尾。
5.最后一个非空格字符只能是数字或者’.’。
6.整个字符串必须包含数字。
本题我被坑的测试用例在此做个总结,以免后人多次提交:
“e9”、“1 “、” “、”.1”、“3.”、"."、". 1"、“1 4”、" 0"、“1 .”、“0e “、“6+1”、”.-4”、"+ 1"
class Solution {
public boolean isNumber(String s) {
char[] arr = s.toCharArray();
int index = 0;
int len = s.length();
boolean flag = false;//记录+-号的出现
int flag_E = 0;//记录e/E的出现
int flag_point = 0;//记录.的出现
boolean flag_num = false;//记录数字是否出现过
boolean flag_blank = false;//记录有害空格是否出现过
int last=0;//记录最后一个非空元素的索引
while(index<len){
if(!flag && (arr[index]=='-'||arr[index]=='+')){
//flag为false时,+-才能合法出现。出现在开头或者e/E后面都是合法的
flag = true;
}else if(!flag_blank && arr[index]<='9'&&arr[index]>='0'){
//在数字前面不能有有害的空格出现,有害的空格指的是数字字符串中间部分的空格
flag_num=true;
flag = true;
}else if(!flag_blank && flag_num && (arr[index]=='e'||arr[index]=='E')){
//出现e/E前面不能有有害空格且必须有数字
flag = false;
flag_E++;
}else if(!flag_blank && flag_E==0 && arr[index]=='.'){
//出现.前面不能有有害空格,并且不能出现e/E
flag_point++;
flag = true;
}else if(arr[index]==' '){
if(flag_num || flag_E>0 || flag_point>0 || flag){
//开头的空格和结尾的空格不进行计算,只有当+/-、数字、e/E、.出现后才进行记录
flag_blank = true;
last--;//如果是结尾的空格,则将last--
}
}else{
return false;
}
last++;
index++;
if(flag_E>1||flag_point>1) return false;//e/E和.至多出现一次
}
if(!flag_num)return false;//如果没有出现数字,则返回false
if(arr[last-1]=='.' || (arr[last-1]>='0' && arr[last-1]<='9'))return true;
//如果最后一个字符为.或者数字,则返回true。否则返回false,比如最后一个字符为e/E
return false;
}
}