【剑指offer20】【C++】表示数值的字符串【模拟】

38 篇文章 0 订阅

【剑指offer20】【C++】表示数值的字符串【模拟】

题目

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

题解

笔记(参考力扣题解)

思路:
1)先去除字符串首尾的空格
2)然后根据e划分指数和底数
3)判断指数和底数是否合法即可

int i = s.find_first_not_of(' ');//找到字符串中第一个不是' '的下标
int j = s.find_last_not_of(' ');//找到字符串中最后一个不是' '的下标
if(e==string::npos)等同于if(e==-1)//没找到

代码:

class Solution {
public:
    bool isNumber(string s) {
        //judge s is empty or not
        int i = s.find_first_not_of(' ');
        if(i==-1) return false;
        int j = s.find_last_not_of(' ');
        s = s.substr(i,j-i+1);
        if(s.empty()) return false;

        //split digit and index according to e
        int e = s.find('e');
        if(e==string::npos)//等价于e==-1没找到
            return judgeDigit(s);
        else    
            return 
             //整数部分从0下标开始,长度为下标[e-1]-0+1=e;指数部分从e+1下标开始,长度为 [s.size()-1] - (e+1) + 1 = s.zies()-1-e
             judgeDigit(s.substr(0,e))&&judgeIndex(s.substr(e+1,s.size()-1-e));         
           //下面同上,指数部分的substr(e+1)指砍去包括e下标和之前的字符串,取e+1下标之后的部分
            //judgeDigit(s.substr(0,e))&&judgeIndex(s.substr(e+1));

    }
    bool judgeDigit(string s){
        cout<<"digit is: "<<s<<endl;
        bool isdot = false;
        bool res = false;
        for(int i=0;i<s.size();i++){
            if(s[i]=='-'||s[i]=='+'){
                if(i!=0)//符号位不在第一位,返回false
                    return false;
            }
            else if(s[i]=='.'){
                if(isdot)//如果之前已经出现过小数点,返回false
                    return false;
                isdot = true;
            }
            else if(s[i]<'0'||s[i]>'9')
                return false;
            else
                res = true;
        }
        return res;
    }
    bool judgeIndex(string s){
        cout<<"index is: "<<s<<endl;
        bool res = false;
        for(int i=0;i<s.size();i++){
            if(s[i]=='-'||s[i]=='+'){
                if(i!=0)
                    return false;
            }
            else if(s[i]<'0'||s[i]>'9')//注意指数不能出现小数点,所以出现除符号位的非纯数字均表示指数不合法
                return false;
            else
                res = true;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值