题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路
思路1:调用库函数。通过调用Double类的转换成Double类型的方法,判断转换的过程当中是否抛出异常即可。
用Double.parseDouble()是把字符串变成double类型。
如果要变成int,则用Integer.parseInt()
思路2:模拟法。可以从正面考虑也可以从反面考虑,具体见代码。难点在于归纳所有的正确情况或者错误情况。
思路3:使用正则表达式。
☆解法1
public class Solution { public boolean isNumeric(char[] str) { //String s = String.valueOf(str); String s = new String(str); // 要单独处理,例如输入 "959.94f" 不会抛出异常 if (s.endsWith("f") || s.endsWith("d")|| s.endsWith("F")|| s.endsWith("D")) return false; try { Double.parseDouble(s); }catch (Exception e){ return false; } return true; } }
解法2.1(考虑反面情况,只能通过牛客)
public class Solution { public boolean isNumeric(char[] str) { if (str == null || str.length == 0) return false; // 标记符号,小数点,e是否出现过 boolean sign = false, decimal = false, hasE = false; for (int i = 0; i < str.length; i++) { if (str[i] == 'e' || str[i] == 'E'){ if (i == 0 || i == str.length - 1) return false; // e不能位于首位和末尾 if (str[i - 1] == '.') return false; // e不能直接在小数点后面 if (hasE) return false; // 只能出现1个e hasE = true; }else if (str[i] == '+' || str[i] == '-'){ if (!sign && i != 0 && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符号第一次出现必须在首位或者E后边 if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符号第二次出现必须在e后边 sign = true; }else if (str[i] == '.'){ if (hasE || decimal) return false; // E后边不能有小数,并且小数点只能出现一次 if (i == str.length - 1) return false; // 小数点不能出现在最后一位 decimal = true; }else if (str[i] < '0' || str[i] > '9'){ // 不合法字符 return false; } } return true; } }
☆☆解法2.2(考虑正面情况,牛客力扣均能AC)
public class Solution { public boolean isNumeric(char[] str) { if (str == null || str.length == 0) return false; // 标记是否遇到数位、小数点、‘e’或'E' boolean numFlag = false,dotFlag = false, eFlag = false; for (int i = 0; i < str.length; i++) { // 判定为数字 if (str[i] >= '0' && str[i] <= '9'){ numFlag = true; // 判定为. 需要没出现过.并且没出现过e }else if (str[i] == '.' && !dotFlag && !eFlag){ dotFlag = true; // 判定为e 需要没出现过e,并且出现过数字了 }else if ((str[i] == 'e' || str[i] == 'E') && !eFlag && numFlag){ eFlag = true; numFlag = false; //重置isNum,因为‘e’或'E'之后也必须接上整数,防止出现 123e或者123e+的非法情况 // 判定为+-符号 只能出现在第一位或者紧跟e后面 }else if ((str[i] == '+' || str[i] == '-') && (i == 0 || str[i-1] == 'e' || str[i-1] == 'E')){ }else { // 其他情况都是非法的 return false; } } return numFlag; } }
解法3
Mark