題目:請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來(lái)判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數(shù)值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
練習(xí)地址
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)'.',則接下來(lái)是數(shù)字的小數(shù)部分
if (i < str.length && str[i] == '.') {
i++;
// 下面一行代碼用||的原因:
// 1. 小數(shù)可以沒(méi)有整數(shù)部分,如 .123 等于 0.123;
// 2. 小數(shù)點(diǎn)后面可以沒(méi)有數(shù)字,如 233. 等于 233.0;
// 3. 當(dāng)然,小數(shù)點(diǎn)前面和后面可以都有數(shù)字,如 233.666
numeric = scanUnsignedInteger(str) || numeric;
}
// 如果出現(xiàn) 'e' 或者 'E',則接下來(lái)是數(shù)字的指數(shù)部分
if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
i++;
// 下面一行代碼用&&的原因:
// 1. 當(dāng) e 或 E 前面沒(méi)有數(shù)字時(shí),整個(gè)字符串不能表示數(shù)字,如 .e1、e1;
// 2. 當(dāng) e 或 E 后面沒(méi)有整數(shù)時(shí),整個(gè)字符串不能表示數(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++;
}
// 當(dāng) str 中存在若干 0~9 的數(shù)字時(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ù)雜度分析
- 時(shí)間復(fù)雜度:O(n)。
- 空間復(fù)雜度:O(1)。