面试题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/

具体思路和步骤分如下

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

程序源码

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来划分指数和底数
     //指数为空,判断底数
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; } };

猜你喜欢

转载自www.cnblogs.com/wzw0625/p/12572914.html
今日推荐