題目:請實現(xiàn)一個函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如棋傍,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值难审。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
練習地址
https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/
參考答案
class Solution {
private int i;
public boolean isNumber(String s) {
if (s == null) {
return false;
}
char[] str = s.trim().toCharArray();
i = 0;
boolean numeric = scanInteger(str);
// 如果出現(xiàn)'.'麸拄,則接下來是數(shù)字的小數(shù)部分
if (i < str.length && str[i] == '.') {
i++;
// 下面一行代碼用||的原因:
// 1. 小數(shù)可以沒有整數(shù)部分黔姜,如 .123 等于 0.123;
// 2. 小數(shù)點后面可以沒有數(shù)字淮椰,如 233. 等于 233.0纳寂;
// 3. 當然,小數(shù)點前面和后面可以都有數(shù)字毙芜,如 233.666
numeric = scanUnsignedInteger(str) || numeric;
}
// 如果出現(xiàn) 'e' 或者 'E',則接下來是數(shù)字的指數(shù)部分
if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
i++;
// 下面一行代碼用&&的原因:
// 1. 當 e 或 E 前面沒有數(shù)字時猾浦,整個字符串不能表示數(shù)字灯抛,如 .e1、e1对嚼;
// 2. 當 e 或 E 后面沒有整數(shù)時,整個字符串不能表示數(shù)字纵竖,如 12e、12e+5.4
numeric = numeric && scanInteger(str);
}
return numeric && i == str.length;
}
private boolean scanUnsignedInteger(char[] str) {
int before = i;
while (i < str.length && str[i] >= '0' && str[i] <= '9') {
i++;
}
// 當 str 中存在若干 0~9 的數(shù)字時已脓,返回 true
return i > before;
}
private boolean scanInteger(char[] str) {
if (i == str.length) {
return false;
}
if (str[i] == '+' || str[i] == '-') {
i++;
}
return scanUnsignedInteger(str);
}
}
復(fù)雜度分析
- 時間復(fù)雜度:O(n)通殃。
- 空間復(fù)雜度:O(1)。