• 面试题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; } };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    set<char*>s
    sscanf()函数。
    C语言函数sscanf()的用法 (转载
    zjut 1179 平均数
    C++数据间隔
    C++ 保留小数
    c++ 保留小数
    c语言 保留两位小数
    c++ 如何实现保留小数并 且 不进行四舍五入
    uva-657-搜索
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12572914.html
Copyright © 2020-2023  润新知