欢迎来到王正伟的博客

返回顶部

面试题20:表示数值的字符串(C++)

题目地址:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

题目示例

例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"0123"及"-1E-16"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。

解题思路

参考文章:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/cmo-ni-ti-si-lu-jian-dan-luo-ji-qing-xi-by-xiaonen/

分析题目可知,字符串表示数值相当于将字符串划分为3部分,即用A表示小数点之前,用B表示小数点之后e之前 ,而用C表示e之后,需要注意的是若e存在,C必须存在,等同于e后面必须跟一个数。而字符串只能是两种形式A[.[B]][e|EC]//.B[e|EC],其中A为带符号的整数,B为无符号整数,小数点前后需要有数字,e后面必须有一个有符号整数。

具体思路和步骤分如下

  • Step1:去掉字符串s的首尾空格
  • Step2:根据e划分指数和底数,若指数为空,则判断底数,否则,判断指数和底数是否合法
  • Step3:调用指数判断函数judgeS()和底数判断函数judgeP(),分别判断指数和底数是否满足题目要求

程序源码

程序1

class Solution {
public:
    bool isNumber(string s) {
        int flag = 0; //标记是否检测到数字
        if(s == "") return false;
        while(s[0] == ' ') s = s.substr(1); //检测字符串之前是否有空格
        if(s[0] == '+' || s[0] == '-') s = s.substr(1); //遇到正负号,向后移动
        while(((s[0] - '0') >= 0) && ((s[0] - '0') <= 9))
        {
            s = s.substr(1);
            flag = 1;
        } 
        if(s[0] == '.') //若该位置为小数点,向后移,并判断是否有数字
        {
            s = s.substr(1);
            while(((s[0] - '0') >= 0) && ((s[0] - '0') <= 9))
             {
                s = s.substr(1);
                flag = 1;
            }
        }
        if(flag == 0) return false; //判断小数点之前的部分是否有数字,若没有,返回false
        flag = 0;
        if(s[0] == 'e' || s[0] == 'E') //判断是否存在e,若存在,则判断后面是否拥有数字
        {
            s = s.substr(1);
            if(s[0] == '+' || s[0] == '-') s = s.substr(1); //遇到正负号,向后移动
            while(((s[0] - '0') >= 0) && ((s[0] - '0') <= 9))
            {
                 s = s.substr(1);
                 flag = 1;
        }
            if(flag == 0) return false; //如果有e,但后面没有数字
    }
        while(s[0] == ' ') s = s.substr(1); //字符串末尾是空格的情况
        if(s == "") return true; //如果结束了就是true,否则返回false
        return false;
    }
};

程序2

class Solution {
public:
    bool isNumber(string s) {
     /*去掉字符串首尾空格*/
if(s.size() < 1) return false; s.erase(0, s.find_first_not_of(' ')); s.erase(s.find_last_not_of(' ') + 1); int e = s.find('e'); //根据e来划分指数和底数
     int E = s.find('E');
     e = e == string::npos ? E : e; //考虑E和e的情况
     //指数为空,判断底数
if(e == string::npos) return judgeP(s);
     //指数不为空,判断底数和指数
else return judgeP(s.substr(0,e))&&judgeS(s.substr(e+1)); }
  /*底数合法性判断*/
bool judgeP(string s) { bool res=false,point=false; for(int i = 0;i < s.size(); ++i) { if(s[i] == '+'|| s[i] == '-'){ //符号位不在第一位,返回false if(i != 0) return false; } else if(s[i] == '.'){ //多个小数点,返回false if(point) return false; point = true; } else if(s[i] < '0'|| s[i] > '9'){ //非法字符,即非纯数字,返回false return false; } else{ res = true; } } return res; }
  /*指数合法性判断*/
bool judgeS(string s) { 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; } };
posted @ 2020-03-26 11:05  Mr.King~  阅读(413)  评论(0)    收藏  举报