Valid Number
題意:
Validate if a given string is numeric.
Example
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
解題思路:這題困難在於太多 corner case 要考慮,首先我們把字串由左到右分成以下四個部份:
- 前綴空白 (可有可不有)
- 正負號 (可有可不由)
- 數字 (必要)
- 後綴空白 (可有可不有)
其實我們只需要檢查第 3 個部份來驗證是否為有效數字。
接著我們需要把數字的部份切成以下部份來分析:
- 整數
- 小數
- 小數點
解題步驟如下:
- 忽略正負號與前綴空白。
- 檢查每一個數字是否為正整數,若是則繼續,否則結束。
- 若有小數點,則繼續往下檢查正整數。
- 把後面的後綴空白一一省略
- 最後檢查isvalid是否為真,以及 i是否已經到字串結尾。
程式碼如下,目前並未考慮科學符號:
public class Solution {
/**
* @param s the string that represents a number
* @return whether the string is a valid number
*/
public boolean isNumber(String s) {
int i = 0;
int len = s.length();
boolean isValid = false;
// 忽略正負號與 leading whitespaces
while (i < len && (s.charAt(i) == '-' || s.charAt(i) == '+' || Character.isWhitespace(s.charAt(i)))) {
i++;
}
// 一一檢查每個digit是否為數字
while (i < len && Character.isDigit(s.charAt(i))) {
i++;
isValid = true;
}
// 若含小數的話,則繼續往下檢查
if (i < len && s.charAt(i) == '.') {
i++;
while (i < len && Character.isDigit(s.charAt(i))) {
i++;
isValid = true; // 防止有這種 .1343 的情況
}
}
// 忽略 trailing spaces
while (i < len && Character.isWhitespace(s.charAt(i))) {
i++;
}
//除了檢查isvalid外,記得注意i是否到底了。
return isValid && i == len;
}
}
若考慮科學符號 $$e$$ 的話,則需要再多加一段code,在小數點檢查之後。
if (isNumeric && i < n && s.charAt(i) == 'e') {
i++;
isNumeric = false;
if (i < n && (s.charAt(i) == '+' || s.charAt(i) == '-')) i++;
while (i < n && Character.isDigit(s.charAt(i))) {
i++;
isNumeric = true;
}
}