題目:請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:表示數值的字符串遵循模式A[.[B]][e/EC] 或者.B[e/EC],其中A爲數值的整數部門,B爲小數部分,C緊跟着e或E爲指數部分。其中A和C都可能以"+"或”-“出現,B沒有符號。因此流程爲:
1. 定義三個bool變量,hasE, sign,decimal用來記錄字符串是否出現過E,符號,小數點
2. 依此掃描,如果掃描E或e,則e後面要有數字,且只能出現一個e,hasE變爲True
3. 如果掃描到“+”或“-”,如果第一次出現符號,且不在開頭,則要緊跟e後面,如果是第二次出現符號,則必須緊跟e後面,sign變爲True
4. 如果掃描到".",如果出現過E或小數點,則爲False, decimal變爲True
5. 數字部分必須在“0-9”之間
class Solution:
# str字符串
def isNumeric(self, str):
hasE = False
sign = False
decimal = False
if str is None:
return False
for i in range(len(str)):
if str[i]=="e" or str[i]=="E":
# e後面一定要有數字
if i==len(str)-1:
return False
if hasE:
return False
hasE = True
elif str[i]=="+" or str[i]=="-":
# 第二次出現符號要緊跟e後面
if sign and str[i-1]!="e" and s[i-1]!="E":
return False
# 第一次出現符號,且不在開頭,那麼也要緊跟e
if sign==False and i>0 and str[i-1]!="e" and str[i-1]!="E":
return False
sign == True
elif str[i]==".":
# 小數點不再e後面,且不能出現兩次
if hasE or decimal:
return False
decimal = True
elif str[i]<"0" or str[i]>"9":
return False
return True
if __name__=="__main__":
str="5e2"
solution = Solution()
result = solution.isNumeric(str)
print(result)