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

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

题目

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof

分析

先吐槽一句,这题的题面说的啥啊
总体思路:
根据题目的意思,可以把字符串根据e(小写)分为两部分,底数和指数部分.
底数部分:
1.可以使用一次’.’,剩下的都是数字.(除了第一个的’+’/’-’)
2.小数点左右不能都没有东西.
3.必须要有数字 不能出现 ‘+e1 ’ 这种.
指数部分:(简化版的底数)
1.不能使用. 都是数字.(除了第一个的’+’/’-’)
2.必须要有数字,不能出现’+1e+’ 这种.

我在不断的试错,疯狂打补丁,补了五次,有的是因为题面不清楚,有的是自己没考虑到的

  1. ‘.’ 这种是 小数点左右没有东西 使用

     if(flag==st&&flag==s.length()-1) return false;
    

    来判断左右都没有(“1.“和”.1” 这两种是应该过的.题目没有描述清楚)

  2. “1(空格)” 这题目完全没有说空格.这不就是让我们猜么,我还猜了"1(空格).",没过.找到规律只有前面和后面的空格要删,里面的就当是字符串错了,所以

    int wode=s.length()-1;
       for(;wode>=0;wode--)
       {
           if(s[wode]!=' ') break;
       }
       s=s.substr(0,wode+1);
       wode=0;
       for(;wode<s.length();wode++)
       {
           if(s[wode]!=' ') break;
       }
       int len=s.length()-wode;
       s=s.substr(wode,len);
    

    删除前后的空格

  3. “4e+” 这种底数和指数都是一个改法.就是使用st记录字符串开始的数字的下标,和整个字符串结尾下标进行比对,就可以.

       if(st==s.length()) return false;

整体写的比较naive,没有什么章法,就是比较乱,但是题面也没说啥硬性指标,只能一个一个试,莫得办法.

代码

class Solution {
public:
    bool check1(string s)
    {
        if(s.length()==0) return false;
        int flag=-1;
        int st=0;
        if(s[0]=='+'||s[0]=='-') st++;
        for(int pos=st;pos<s.length();pos++)
        {
            if(s[pos]=='.'){
                if(flag!=-1)
                    return false;
                else flag=pos;
            } 
            else if(s[pos]>'9'||s[pos]<'0')
                return false;
        }
        if(flag==st&&flag==s.length()-1) return false;
        if(st==s.length()) return false;
        return true;
    }
    bool check2(string s)
    {
        if(s.length()==0) return false;
        int st=0;
        if(s[0]=='+'||s[0]=='-') st++;
        for(int pos=st;pos<s.length();pos++)
        {
            if(s[pos]>'9'||s[pos]<'0') 
                return false;
        }
        if(st==s.length()) return false;
        return true;
    }
    bool isNumber(string s) {
        int wode=s.length()-1;
        for(;wode>=0;wode--)
        {
            if(s[wode]!=' ') break;
        }
        s=s.substr(0,wode+1);
        wode=0;
        for(;wode<s.length();wode++)
        {
            if(s[wode]!=' ') break;
        }
        int len=s.length()-wode;
        s=s.substr(wode,len);
        int pp=s.find("e");
        if(pp==s.npos)
        {
            return check1(s);
        }
        else
        {
            string a=s.substr(0,pp),b=s.substr(pp+1);
            return check1(a)&&check2(b);
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值