LeetCode 剑指 Offer 20. 表示数值的字符串

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。

 

思路:一开始想整个字符处理,但是发现容易出现判断条件过多的情况。故根据科学计数法的形式将数值分成两个(底数和浮点数两块)。即E前面的字符temp1,和E后面的字符temp2。 前面和后面的两个数判断标准基本一样,唯一差别为浮点数temp2不能是小数。

注意点:

  1.可能出现非数字,正负号,小数点,E/e之外的数

  2.正负号的位置是否对

  3. 浮点数temp2不能有小数

  4. 整个字符最前面和最后面的空格等并不算,可以直接去掉

  5. 字符中间的空格和tap等是要算的,如果有则输出False

以下为提交的代码:

# 提交的代码
class Solution:
    shuzi=['0','1','2', '3', '4', '5', '6', '7', '8', '9']
    def num(self,s,t):
        ans = 0
        for i in s:
            if(i==t):ans+=1
        return ans
        
    def num_shuzi(self, s):
        ans = 0
        for i in s:
            if(i in self.shuzi): ans+=1
        return ans

    def isNumber(self, s: str) -> bool:
        # + - . e E
        zifu = ['-','+','.','E','e','0','1','2', '3', '4', '5', '6', '7', '8', '9']
        s = s.lower()
        s=s.replace('-','+')
        s = s.strip()
        for i in s:
            if(i not in zifu):return False

        if(self.num_shuzi(s)==0):return False
        
        if('e' in s):
            num1 = self.num(s,'e')
            if(num1>1): return False
            temp1, temp2 = s.split("e")[0], s.split("e")[1]
        else:
            temp2 = '1'
            temp1 = s

        # 正负号
        num1 = self.num(temp1,'+')
        num2 = self.num(temp2,'+')
        #print(num1,num2,"====")
        if(num1 > 1 or num2 > 1):return False
        if(num1==1 and temp1[0]!='+'): return False
        if(num2==1 and temp2[0]!='+'): return False

        # 左右的数字
        num1 = self.num_shuzi(temp1)
        num2 = self.num_shuzi(temp2)
        if(num1 ==0 or num2 ==0): return False

        # 左右的小数点
        num1 = self.num(temp1,'.')
        num2 = self.num(temp2,'.')
        if(num2>0 or num1>1):return False
        return True

 

无赖做法(直接异常处理),自己写代码可以,面试官好看的话还是不要放:

class Solution:
    def isNumber(self, s: str) -> bool:
        try:
            float(s)
        except ValueError:
            return False
        return True

有限自动机写:思路很清晰

https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/mian-shi-ti-20-biao-shi-shu-zhi-de-zi-fu-chuan-y-2/

 

你可能感兴趣的:(LeetCode,字符串)