https://leetcode.com/problems/valid-number/#/description
Validate if a given string is numeric.
Some examples:
"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
Update (2015-02-10):
The signature of the C++
function had been updated. If you still see your function signature accepts a const char *
argument, please click the reload button to reset your code definition.
思路:这道题关键是分析所有会出现的情况。以及设置关键的flag来记录各种情况
首先使用trim()函数去除前后空格。
设置4个标志,分别是
boolean pointSeen = false;//是否出现过小数点“.”
boolean eSeen = false;//是否出现过指数标志“e”
boolean numberSeen = false;//是否出现过数字
boolean numberAfterE = true;//e后面是否有数字
进行循环s.charAt(i):
1.如果属于[0,9],把numberSeen设为true
2.如果是‘.’,必须之前没有遇到'.'和'e'
3.如果是'e',必须之前没有遇到过'e'
4.如果是'+'或者'-',当前i必须是0,或者i-1上的字符是e
5.其他情况返回false
Java Code:
package go.jacob.day722;
/**
* 65. Valid Number
*
* @author Jacob
*
*/
public class Demo1 {
/*
* Runtime: 3 ms.Your runtime beats 83.72 % of java submissions.
* 思路:这道题关键是分析所有会出现的情况。以及设置关键的flag来记录各种情况
* 首先使用trim()函数去除前后空格。
* 设置4个标志,分别是
* boolean pointSeen = false;//是否出现过小数点“.”
* boolean eSeen =alse;//是否出现过指数标志“e”
* boolean numberSeen = false;//是否出现过数字
* booleannumberAfterE = true;//e后面是否有数字
* 进行循环s.charAt(i):
* 1.如果属于[0,9],把numberSeen设为true
* 2.如果是‘.’,必须之前没有遇到'.'和'e'
* 3.如果是'e',必须之前没有遇到过'e'
* 4.如果是'+'或者'-',当前i必须是0,或者i-1上的字符是e
* 5.其他情况返回false
*/
public boolean isNumber(String s) {
s = s.trim();
if (s == null || s.length() == 0)
return false;
// 记录是否出现过数字
boolean numberSeen = false;
// 是否出现过小数点
boolean pointSeen = false;
// 是否出现过指数标志e
boolean eSeen = false;
// e后是否出现过数字
boolean numberAfterE = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 如果是数字
if (c >= '0' && c <= '9') {
numberSeen = true;
numberAfterE = true;
// 如果是小数点
} else if (c == '.') {
if (pointSeen || eSeen)
return false;
pointSeen = true;
// 如果是e,必须没有出现过且出现过数字
} else if (c == 'e') {
if (eSeen || !numberSeen)
return false;
eSeen = true;
numberAfterE = false;
// 如果出现正负号,必须是首位,或者前一位是e
} else if (c == '+' || c == '-') {
if (i != 0 && s.charAt(i - 1) != 'e')
return false;
} else
return false;
}
return numberSeen && numberAfterE;
}
/*
* 1.只能有一个小数点,指数不能使小数 2.正负号;3.前后空格;4.只有一个点(.);5.(-.) 我的解法,特别复杂,不推荐
*/
public boolean isNumber_1(String s) {
s = s.trim();
if (s == null || s.length() == 0)
return false;
int index = s.indexOf("e");
if (index == 0 || index == s.length() - 1)
return false;
return index == -1 ? isBase(s, s.length()) : isBase(s, index) && isExp(s, index);
}
private boolean isBase(String s, int index) {
System.out.println("index2:" + index);
s = s.substring(0, index);
boolean hasComma = false;
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
if ((s.charAt(0) == '+' || s.charAt(0) == '-')) {
if (s.length() > 1)
continue;
else
return false;
} else if (s.charAt(0) == '.')
if (s.length() > 1) {
hasComma = true;
continue;
} else
return false;
}
if (s.charAt(i) == '.')
if (!hasComma) {
hasComma = true;
} else {
return false;
}
else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
continue;
} else
return false;
}
return true;
}
private boolean isExp(String s, int index) {
s = s.substring(index + 1, s.length());
for (int i = 0; i < s.length(); i++) {
if (i == 0 && (s.charAt(0) == '+' || s.charAt(0) == '-')) {
if (s.length() > 1)
continue;
else
return false;
}
if (s.charAt(0) < '0' || s.charAt(0) > '9')
return false;
}
return true;
}
public static void main(String[] args) {
String s = "qwer";
System.out.println(s.indexOf("r"));
}
}