题目地址: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"都不是。
解题思路
分析题目可知,字符串表示数值相当于将字符串划分为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; } };