Problem:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
Intuition:
首先我们来看一下题干里面的数字有哪些特点,不难发现所有的数字都可以大体写成整数+符号(小数点或者E,e)+整数的形式(如果第一个符号是小数点还可能出现第二个符号是e,但是总体来说不会出现比这种情况更复杂的情况了)。实现的时候我们要注意两个点。1.最好用一个全局变量index来存当前扫描到的下标,否则不断对下标进行传参或者进行数组的拷贝很麻烦也很容易出错。2.在进行其他判断之前都要判断数组是否越界,养成良好的习惯。
Solution:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| public class CodingInterview_020 { public static void main(String[] args) { CodingInterview_020 main=new CodingInterview_020(); String s="+31.4e-1"; System.out.println(main.isNumeric(s.toCharArray())); }
private int index = 0;
public boolean isNumeric(char[] str) { if (str.length < 1) return false; boolean flag = scanInteger(str);
if (index < str.length && str[index] == '.') { index++; flag = scanUnsignedInteger(str) && flag; }
if (index < str.length && (str[index] == 'E' || str[index] == 'e')) { index++; flag = flag && scanInteger(str); }
return flag && index == str.length;
}
private boolean scanInteger(char[] str) { if (index < str.length && (str[index] == '+' || str[index] == '-') ) index++; return scanUnsignedInteger(str);
}
private boolean scanUnsignedInteger(char[] str) { int start = index; while (index < str.length && str[index] >= '0' && str[index] <= '9') index++; return start < index; }
}
|