前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode-面试题20-表示数值的字符串

LeetCode-面试题20-表示数值的字符串

作者头像
benym
发布2022-07-14 15:04:25
2980
发布2022-07-14 15:04:25
举报
文章被收录于专栏:后端知识体系后端知识体系

# LeetCode-面试题20-表示数值的字符串

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

# 解题思路

一位一位进行判断,字符串遵循模式A[.[B]][e|EC]或者.[B][e|EC]

其中A和C都是可能以+或者-开头的0~9的数位串

B也是0~9的数位串,但是不能带有正负号

C紧跟着'e'或者'E'为数值的指数部分

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0~9的数位(有可能在起始处有'+'或'-',也就是前面模式中表示数值整数的A部分),如果遇到小数点'.',则开始扫描表示数值小数部分的B部分,如果遇到'e'或者'E',则开始扫描表示数值指数的C部分

# Java代码

代码语言:javascript
复制
class Solution {
    public boolean isNumber(String s) {
        if(s==null||s.length()==0)
            return false;
        boolean isNum = false;
        boolean isDot = false;
        boolean isE = false;
        char[] str = s.trim().toCharArray();
        for(int i = 0;i < str.length;i++){
            if(str[i]>='0'&&str[i]<='9'){
                isNum = true;
            }
            else if('.'==str[i]){
                // .的前面不能有.或者E
                if(isDot||isE)
                    return false;
                isDot = true;
            }
            else if(str[i]=='e'||str[i]=='E'){
                // e或E的前面不能有e/E,只能是数字
                if(isE||isNum==false)
                    return false;
                isE = true;
                // 越过e之后必须要有数字,重置isNum,记录后面是不是有数字出现
                // 如果e是最后一位,则这个数字不合法
                isNum = false;
            }
            else if(str[i]=='+'||str[i]=='-'){
                // 只有i=0或者e/E前面出现正负号的时候才合法,不然就是非法
                if(i!=0&&str[i-1]!='e'&&str[i-1]!='E')
                    return false;
            }
            else{ // 其他非法情况
                return false;
            }
        }
        return isNum;
    }
}

# Python代码

代码语言:javascript
复制
class Solution:
    def __init__(self):
        self.p = 0

    def isNumber(self, s: str) -> bool:
        s = s.strip()
        if not s: return False
        numeric = self.scanInteger(s)
        if self.p > len(s)-1:
            return numeric
        if self.p < len(s) and s[self.p] == '.':
            self.p +=1
            if self.p > len(s)-1:
                return numeric
            numeric = self.scanUnsignedIntergers(s) or numeric
        if self.p < len(s) and s[self.p] in ['e','E']:
            self.p +=1
            if self.p > len(s)-1:
                return False
            numeric = numeric and self.scanInteger(s)
        if self.p < len(s):
            return False
        return numeric
    
    def scanInteger(self,s):
        if s[self.p] in ['+','-']:
            self.p +=1
        return self.scanUnsignedIntergers(s)
    
    def scanUnsignedIntergers(self,s):
        pre = self.p
        while(self.p < len(s) and s[self.p]>='0' and s[self.p]<='9'):
            self.p +=1
        return self.p>pre
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # LeetCode-面试题20-表示数值的字符串
    • # 解题思路
      • # Java代码
        • # Python代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档