题目
描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
解题思路
1. 暴力匹配模式 时间复杂度为O(n),空间复杂度O(n)
- 列出条件
1 .不能出现多次,且不能出现在 e/E 后 2 e/E只能出现一次或者不出现,并且出现之前前面必须有数字 3 不能出现除了数字以及.+-eE之外的任符号
package JZ53; class Solution { public boolean isNumeric(String s) { if (s == null || s.trim().equals("")) { return false; } boolean numberCheck = false; boolean sign = false; boolean eCheck = false; char[] numberArr = s.trim().toCharArray(); for (int i = 0; i < numberArr.length; i++) { if (numberArr[i] >= '0' && numberArr[i] <= '9') { numberCheck = true; } else if (numberArr[i] == '.') { // 小数点不能出现多次,只能出现0次或者不出现,而且必须出现在e或者E前面 if (!sign && !eCheck) { sign = true; } else { return false; } } else if (numberArr[i] == 'e' || numberArr[i] == 'E') { // e/E 只能出现0次或者1次,并且出如果出现前面必须已经出现过数字 if (!eCheck && numberCheck) { eCheck = true; numberCheck = false; } else { return false; } } else if (numberArr[i] != '+' && numberArr[i] != '-') { //不能出现除了数字以及.+-eE之外的任符号 return false; } else { // e/E 只能出现在 0 位置或 e/E 后一个位置 if (i > 0 && numberArr[i - 1] != 'e' && numberArr[i - 1] != 'E') { return false; } } } return numberCheck; } }
2. 正则表达式
- ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
- *匹配前面的子表达式零次或多次
- +匹配前面的子表达式一次或多次
- .匹配除换行符 \n 之外的任何单字符.
- [\d] 匹配数字字符
- [0-9] 匹配0~9中任意的数字
- ^ 匹配字符串头部位置
- $ 匹配字符串尾部位置
public boolean isNumeric(String s) { //判断s是否为null以及长度是否为0,并且s必须是包含数字的 if (s == null || s.length() == 0 || !s.matches(".*\\d.*")) { return false; } // 去除字符串后的空格 s = s.trim(); // 如果s包含了e或者E if (s.contains("e") || s.contains("E")) { // 当e没有数字的时候 if (s.matches("[^\\d]*[e|E].*")) { return false; } return (s.matches("^[\\+-]?\\d*\\.?\\d*[e|E][\\+-]?\\d+$")); } else { //如果s不存在e以及E return s.matches("^[\\+-]?(\\d*\\.?)\\d*$"); } }