20 表示数值的字符串
常规解法
在遍历的过程中如果不满足字符串表示数值的条件就返回false,遍历结束之后若没有返回false,且字符串中包含数字,就返回true。其实就是列举出所有false的情况,只有中间过程没有出现false才有可能返回true。
首先定义了四个flag对应四种字符:
是否有数字:hasNum
是否有e:hasE
是否有小数点:hasDot
是否有正负号:hasSign
这道题目还要考虑字符串首尾出现的空格,在开始遍历之前先处理空格
开始遍历。
判断数字使用一个while循环。如果是数字 hasNum置为 true,index++,继续往下遍历如果到了字符串结尾,或者不是数字了就出判断是否是数字的循环。
如果到了字符串结尾,就跳出整个循环,等待后续处理。
如果不是字符串结尾,继续判断字符c的情况:
如果c是e或者E:如果以前出现过e或者E(hasE == true)返回false;如果e或者E的前面没有数字,返回false。否则 其他三个flag置false,hasE置true。
如果c是+或者-:如果以前出现过+或者-,返回flase(这里若是在e之后出现+或-是合理的,但是因为如果出现了e那么hasSign已经置false了,所以不会符合这个条件);如果以前出现过数字,返回false;如果以前出现过小数点,返回false;否则,hasSign置true,继续。
如果c是小数点:如果以前出现过小数点,返回false;如果以前出现过e,返回false(e之后不能是小数,指数必须是整数);否则,hasDot置true;
如果c是空格:break,出循环,经历后续处理。
循环最后index++。
出循环之后,继续处理空格。
然后如果hasNum是true,也就是说有数字,且到了字符串的结尾了,就返回true。
class Solution {
public boolean isNumber(String s) {
boolean hasNum = false;
boolean hasE = false;
boolean hasSign = false;
boolean hasDot = false;
int len = s.length();
int index=0;
//处理空格
while(index<len && s.charAt(index)==' '){
index++;
}
while(index<len){
while(index<len && s.charAt(index)>='0' && s.charAt(index)<='9'){
hasNum = true;
index++;
}
if(index == len){
break;
}
char c = s.charAt(index);