牛客网 表示数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
解题:
public class Solution { private int index = 0; public boolean isNumeric(char[] str) { // input check if(str.length < 1) return false; // execute boolean result = scanInteger(str); if(index < str.length && str[index] == '.'){ index++; // 下面这句表示三种情况:整数部分和小数部分都存在; 整数部分存在,小数部分不存在; 整数部分不存在,小数部分存在 // 不允许出现正数和小数都不出现的情况 // 务必留意: result必须在||右边, 不能放在左边. 因为如果放在左边,同时result又是true, 那么就不会执行||右边的语句了 result = scanUnsignedInteger(str) || result; } if(index < str.length && (str[index] == 'e' || str[index] == 'E')){ index++; result = result && scanInteger(str); } // 不仅要返回result, 还要确保已经判断完每个char return result && (index == str.length); } public boolean scanInteger(char[] str){ if(index < str.length && (str[index] == '+' || str[index] == '-')) index++; return scanUnsignedInteger(str); } public boolean scanUnsignedInteger(char[]str){ int start = index; while(index < str.length && str[index] >= '0' && str[index] <= '9'){ index++; } // index比start大, 说明扫描的部分有数字, 返回ture // index等于start, 说明扫描的部分没有数字, 返回false return start < index; } }