剑指Offer-表示数值的字符串-3
表示数值的字符串
http://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
// 方法3:直接使用IF-ELSE进行判断,覆盖所有可能 // 思路:直接使用IF-ELSE语句扫描每个字符,每次遇到不同类别的字符时,则结合已接收的字符 // 判断是否符合对应的要求.这种思路相比于其他几种方式的缺陷在于, // 容易遗漏各种可能性(当然一方面也是题目的问题). // 接收字符集:[0-9],[Ee],[.],[+-],other // 时间复杂度:O(n),空间复杂度:O(1) public boolean isNumeric(char[] str) { // 排除边界条件 if (str == null || str.length == 0) return false; // 遍历字符数组,按照字符集类别进行不同的处理,每次都向过去检索(而不向后检索),统一检索方向,避免重复运算 boolean hasSign = false, hasPoint = false, hasE = false; // 之前是否出现过[+-]/[.]/[Ee]字符 char c; for (int i = 0; i < str.length; i++) { c = str[i]; // 如果接收的是[Ee]字符 if (c == 'E' || c == 'e') { // [Ee]字符只能出现一次 if (hasE) return false; // [Ee]字符之前必须为[0-9]字符 else if (i - 1 < 0 || str[i - 1] < '0' || str[i - 1] > '9') return false; hasE = true; } // 如果接收的是[+-]字符 else if (c == '+' || c == '-') { // [+-]如果之前出现过,那么当前字符之前必须为[Ee]字符 if (hasSign && str[i - 1] != 'E' && str[i - 1] != 'e') return false; // [+-]如果之前未出现过,那么当前字符必须为首字符,或者前面为[Ee]字符 else if (!hasSign && i != 0 && str[i - 1] != 'E' && str[i - 1] != 'e') return false; hasSign = true; } // 如果接收的是[.]字符 else if (c == '.') { // [.]字符只能出现一次,且之前不能出现过[Ee]字符,PS:[.]字符之前可以为空/[0-9]/[+-] if (hasPoint || hasE) return false; hasPoint = true; } // 其次如果接收的是非数字字符,则直接返回false else if (c < '0' || c > '9') return false; } // 字符结尾必须为数字 return str[str.length - 1] >= '0' && str[str.length - 1] <= '9'; }