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

题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:

  • 若干空格
  • 一个 小数 或者 整数
  • (可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
  • 若干空格

小数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符(’+’ 或 ‘-’)
  • 下述格式之一:
    至少一位数字,后面跟着一个点 ‘.’
    至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
    一个点 ‘.’ ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符(’+’ 或 ‘-’)
  • 至少一位数字

部分数值列举如下:
["+100", “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
部分非数值列举如下:
[“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]

示例 1:
输入:s = “0”
输出:true
示例 2:
输入:s = “e”
输出:false
示例 3:
输入:s = “.”
输出:false
示例 4:
输入:s = " .1 "
输出:true

太繁琐了这个题目,提交了好多遍,完全是根据没有通过的样例改代码。

  • 首先去掉首尾字符串的空白字符,其次如果第一个字符是负号位先去掉该位,如果去掉之后,字符串变成空或者字符串只剩一个字符且该字符出现‘.’ 返回false。错误样例(“+.”,“-.” ,"+" “ ”)
  • 其次这下除了0~9十个数字还有e还有“.” ,“+”,“-”可以出现外,其余字符都不可以出现。错误样例(“e”, “e0” , “0e”, “e+”, “e-”, “6ee69”, “e.”, “.e.”,"…")

正确样例:" 005047e+6"

class Solution {
public:
    bool isNumber(string s) {
        
        int k = 0;
        while(k < s.size() && s[k]==' ') k++;
        int j = s.size() - 1;
        while (j >= 0 && s[j] == ' ') j -- ;
        s=s.substr(k,j-k+1);
        if(s[0]=='+' || s[0]=='-') s=s.substr(1);
        if(s.empty() || s[0]=='.' && s.size()==1) return false;
        int n = s.size();
        int dot=0,e=0;
        for(int i=0;i<n;i++)
        {
            if(s[i]>='0' && s[i]<='9') continue;
            else if(s[i]=='.')
            {
                dot++;
                if(e || dot > 1) return false;
            }
            else if(s[i]=='e'||s[i]=='E')
            {
                e++;
                if(e>1) return false;
                if(i+1==s.size() || !i ||s[i-1]=='.'&& i-1==0) return false; 

               // if(i==0||s[0]=='.') return false;
                if(s[i + 1] == '+' || s[i + 1] == '-')
                {
                    if (i + 2 == s.size()) return false;
                    i ++ ;
                }
            }          
            else return false;
        }
        return true;
    }
};
class Solution {
public:
    bool isNumber(string s) {
        int k=0;
        while(s[k]==' ') k++;
        int j=s.size()-1;
        while(s[j]==' ') j--;
        s=s.substr(k,j-k+1);//去掉字符串前后的空格
        if(s[0]=='+' || s[0]=='-') s=s.substr(1);//去掉只包含+ 或者 - 的
        if(s.empty()||s.size()==1 && s[0]=='.') return false;//去掉只包含.的  去掉啥也没有的
        int dot=0,e=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='0'&&s[i]<='9') continue;
            else if(s[i]=='.')
            {
                dot++;
                if(e || dot>1) return false;//去掉包含两个. 或者 e后面不是整数的字符串
            }
            else if(s[i]=='e'||s[i]=='E')
            {
                e++;
                if(e>1) return false;//去掉包含多个e的
                
                if(!i || i+1 ==s.size() || i-1==0 && s[i-1]=='.') return false;//去掉 e .e  以e结尾的如12e
                
                if(s[i+1]=='+' || s[i+1]=='-') 
                {
                    if(i+2==s.size()) return false;//去掉 e+ e-
                    i++;
                }
            }
            else return false;
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值