劍指53.表示數值的字串
阿新 • • 發佈:2020-09-03
題目描述
請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路
思路1:呼叫庫函式。通過呼叫Double類的轉換成Double型別的方法,判斷轉換的過程當中是否丟擲異常即可。
用Double.parseDouble()是把字串變成double型別。
如果要變成int,則用Integer.parseInt()
思路2:模擬法。可以從正面考慮也可以從反面考慮,具體見程式碼。難點在於歸納所有的正確情況或者錯誤情況。
思路3:使用正則表示式。
☆解法1
public class Solution { public boolean isNumeric(char[] str) { //String s = String.valueOf(str); String s = new String(str); // 要單獨處理,例如輸入 "959.94f" 不會丟擲異常 if (s.endsWith("f") || s.endsWith("d")|| s.endsWith("F")|| s.endsWith("D")) returnfalse; try { Double.parseDouble(s); }catch (Exception e){ return false; } return true; } }
解法2.1(考慮反面情況,只能通過牛客)
public class Solution { public boolean isNumeric(char[] str) { if (str == null || str.length == 0) returnfalse; // 標記符號,小數點,e是否出現過 boolean sign = false, decimal = false, hasE = false; for (int i = 0; i < str.length; i++) { if (str[i] == 'e' || str[i] == 'E'){ if (i == 0 || i == str.length - 1) return false; // e不能位於首位和末尾 if (str[i - 1] == '.') return false; // e不能直接在小數點後面 if (hasE) return false; // 只能出現1個e hasE = true; }else if (str[i] == '+' || str[i] == '-'){ if (!sign && i != 0 && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符號第一次出現必須在首位或者E後邊 if (sign && str[i-1] != 'e' && str[i-1] != 'E') return false; // 符號第二次出現必須在e後邊 sign = true; }else if (str[i] == '.'){ if (hasE || decimal) return false; // E後邊不能有小數,並且小數點只能出現一次 if (i == str.length - 1) return false; // 小數點不能出現在最後一位 decimal = true; }else if (str[i] < '0' || str[i] > '9'){ // 不合法字元 return false; } } return true; } }
☆☆解法2.2(考慮正面情況,牛客力扣均能AC)
public class Solution { public boolean isNumeric(char[] str) { if (str == null || str.length == 0) return false; // 標記是否遇到數位、小數點、‘e’或'E' boolean numFlag = false,dotFlag = false, eFlag = false; for (int i = 0; i < str.length; i++) { // 判定為數字 if (str[i] >= '0' && str[i] <= '9'){ numFlag = true; // 判定為. 需要沒出現過.並且沒出現過e }else if (str[i] == '.' && !dotFlag && !eFlag){ dotFlag = true; // 判定為e 需要沒出現過e,並且出現過數字了 }else if ((str[i] == 'e' || str[i] == 'E') && !eFlag && numFlag){ eFlag = true; numFlag = false; //重置isNum,因為‘e’或'E'之後也必須接上整數,防止出現 123e或者123e+的非法情況 // 判定為+-符號 只能出現在第一位或者緊跟e後面 }else if ((str[i] == '+' || str[i] == '-') && (i == 0 || str[i-1] == 'e' || str[i-1] == 'E')){ }else { // 其他情況都是非法的 return false; } } return numFlag; } }
解法3
Mark