題目描述
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示數值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
正則解法
思路:
- 正則表達式的解法,熟悉正則表達式的可以利用正則表達式解法
- 先判斷是否有加減號一開始,然後後面跟着是不是數字,是就爲true,不是false,
- 如果跟着e則說明是冪函數,後面判斷一次±號然後繼續2的步驟
/*
以下對正則進行解釋:
[\\+\\-]? -> 正或負符號出現與否
\\d* -> 整數部分是否出現,如-.34 或 +3.34均符合
(\\.\\d+)? -> 如果出現小數點,那麼小數點後面必須有數字; 否則一起不出現
([eE][\\+\\-]?\\d+)? -> 如果存在指數部分,那麼e或E肯定出現,+或-可以不出現, 緊接着必須跟着整數;或者整個部分都不出現
*/
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
}
正常解法
思路:
- 利用下標,對字符串長度進行位移判斷
- 判斷第一位會不會出現符號位,不會判斷整數位,整數位判斷完,檢查有.還是有e,.後面跟着整數位,e後面跟着符號位再是整數位
public class Solution {
private int index = 0;
public boolean isNumeric(char[] str) {
if (str.length < 1)
return false;
boolean flag = scanInteger(str); //掃描第一個符號,然後去判斷整數位,如果有整數返回true
if (index < str.length && str[index] == '.') { //整數位判斷完,如果沒有整數位會返回false,有整數位就會接着判斷小數位
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; //是否存在整數
}
}