题解 | #表示数值的字符串#
表示数值的字符串
http://www.nowcoder.com/practice/e69148f8528c4039ad89bb2546fd4ff8
没有什么特别的技巧,自己磨了挺久,写了个凑合能看的,结束在剑指offer的最后一题。。。
主题思路:(1)设置几个全局的标志变量; (2)当出现特殊符号时判断是否符合条件,剩余字符串部分递归检查数字部分
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return bool布尔型
*/
//'e'和'E'标志位
int falgE = 0;
//'.'标志位
int flagX = 0;
//数字标志位
int flagZ = 0;
public boolean isNumeric (String str) {
//去除首尾空格
String s = str.trim();
int i = 0, n = s.length();
if(n == 0) return false;
if(s.charAt(i) == '+' || s.charAt(i) == '-'){
//出现'.'后面数字前不能有+-号,也不能只有+-
if(flagX == 1 || i == n-1) return false;
i++;
}
//遍历字符串
for(int j = i; j < n; j++){
//出现'.',标记为小数
if(s.charAt(j) == '.'){
//重复出现小数或e后有小数则错误
if(falgE == 1 || flagX == 1){
return false;
}else{
flagX = 1;
if(flagZ == 1){
//小数点前有数字,后面可以有或者没有数字
return j == n-1 || isNumeric(s.substring(j+1));
}else{
//小数点前无数字,后面必须有数字
return j+1 < n && isNumeric(s.substring(j+1));
}
}
}
//出现'e'和'E'
else if(s.charAt(j) == 'e' || s.charAt(j) == 'E'){
//前面没有出现整数或重复出现e则错误
if(flagZ == 0 || falgE == 1){
return false;
}else{
falgE = 1;
//恢复小数标志,整数部分允许出现+-号
flagX = 0;
//后面必须有数字
return j+1 < n && isNumeric(s.substring(j+1));
}
}
//正常的数字字符
else if(s.charAt(j) >= '0' && s.charAt(j) <= '9'){
flagZ = 1;
i++;
}
//其他字符则错误
else{
return false;
}
}
return true;
}
}