劍指offer——python【第53題】表示數值的字符串


題目描述

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路

根據題目給出的一些規則,可以表示成數值的字符串類型有:int整型,float浮點型,指數型(包括e和E),當然,前面三種都可以帶上正負號;

不能表示成數值的字符串類型有:指數型錯誤(沒有指數或者指數是小數,或者指數變成了a),float浮點型錯誤,第一個正負號后又帶了正負號

於是,正負號類型的錯誤可以用if..else去判斷;而在判定為沒有正負號的錯誤下,再判斷是否可以表達為數值型,就可以用float函數,再加上try..except

解答

class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        if s[0]=="+" or s[0]=="-":
            if s[1]!="+" and s[1]!="-":
                try:
                    if float(s[1:]):
                        return True
                except:
                    return False
            else:
                return False
        else:
            try:
                if float(s):
                    return True
            except:
                return False

也可以很准確地去判斷:

class Solution:
    # s字符串
    def isNumeric(self, s):
        # write code here
        if s is None or len(s) == 0:
            return False

        # 是否有e
        hasE = False
        # 是否有小數
        isDecimal = False
        # 是否有+-符號
        hasSign = False

        for i in range(len(s)):
            # 如果有e,只能有一個e且不能是最后一個
            if s[i] == "e" or s[i] == "E":
                if hasE or i == len(s) - 1:
                    return False
                hasE = True
            # 小數點不能重復出現或和e共線
            elif s[i] == ".":
                if hasE or isDecimal:
                    return False
                isDecimal = True
            elif s[i] == "-" or s[i] == "+":
                # 重復出現符號時,必須跟在e后面
                if hasSign and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                # 重復出現符號時,必須跟在e后面
                if not hasSign and i > 0 and s[i - 1] != "e" and s[i - 1] != "E":
                    return False
                hasSign = True
            elif s[i] < "0" or s[i] > "9":
                return False
        return True

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM