普通方法(沒研究):
鏈接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
來源:牛客網
public static boolean isNumeric(char[] str) {
int point = 0;//記錄小數點個數
int i = 0;//遍歷str數組用的下標
int eFlag = 0;//e/E出現的次數
//判斷第一個字符是不是符號,是的話後續的判斷就跳過一個數
if(str[0] == '-' || str[0] == '+' ) {
i++;
}
for (; i<str.length; ++i) {
if(str[i] == '+' || str[i] == '-'){
//出現字符,若此字符的前一個字符不是e/E則認爲是多出來的符號
if (str[i-1] != 'e' && str[i-1] != 'E')
return false;
continue;
}
if(str[i] == 'e' || str[i] == 'E') {
eFlag++;
if(eFlag > 1)//e/E不能出現兩次
return false;
//若e/E的前一個字符不是數字,或者e/E出現字符串的第一個或者最後一個,都認爲是錯的
if(i-1<0 || str[i-1] <48 || str[i-1] >57 || i+1>str.length-1 )
return false;
point++;
continue;
}
if (str[i] == '.') {//小數點數字不能超過兩個
++point;
if (point > 1) {
return false;
}
continue;
}
//出現非數字且不是e/E則認爲是錯的(小數點和符號在前面的判斷裏用“continue”跳過了)
if ((str[i] < 48 || str[i] > 57) && (str[i] != 'e') && (str[i] != 'E'))
return false;
}
return true;
}
正則表達式法:
public class Solution {
public boolean isNumeric(char[] str) {
if(str == null || str.length == 0)
return false;
String s = String.valueOf(str);
return s.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
}
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
例如:
-
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 號代表前面的字符必須至少出現一次(1次或多次)。
-
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 號代表字符可以不出現,也可以出現一次或者多次(0次、或1次、或多次)。
-
colou?r 可以匹配 color 或者 colour,? 問號代表前面的字符最多只可以出現一次(0次、或1次)。