面試題20:表示數值的字符串

題目:請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章