剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是。
解题思路
这题编码难度不大,难点在于归纳各种正确的情况
‘.’出现正确情况:只出现一次,且在e的前面
‘e’出现正确情况:只出现一次,且出现前有数字
‘+’ 、‘-’ 出现正确情况:只能在开头或出现在e的后一位
代码
class Solution {
public boolean isNumber(String s) {
if(s == null || s.length() == 0){
return false;
}
//去掉首位空格
s = s.trim();
//标记出现过数字
boolean numFlag = false;
//标记出现过'.'
boolean pointFalg = false;
//标记出现过'e','E'
boolean eflag = false;
for(int i = 0 ; i < s.length(); i++){
// //判定为数字,则标记numFlag
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
numFlag = true;
}
//判定为. 需要没出现过.并且没出现过e
else if(s.charAt(i) == '.' && !pointFalg && !eflag ){
pointFalg = true;
}
//判定为e,需要没出现过e,并且出过数字了
else if((s.charAt(i) == 'e' || s.charAt(i) == 'E') && !eflag && numFlag){
eflag = true;
//为了避免123e这种请求,出现e之后就标志为false
numFlag = false;
}
//判定为+-符号,只能出现在第一位或者紧接e后面
else if( (s.charAt(i) == '+' || s.charAt(i) == '-') && (i ==0 || s.charAt(i-1) == 'e' || s.charAt(i-1) == 'E') ){
}
//其他情况,都是非法的
else{
return false;
}
}
return numFlag;
}
}