题目描述:

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

思路分析:

1. 第一种思路,是对于这种数值表示形式的特殊情况进行分析,这里一共包括了四种情况,需要设定三个数值来对于符号位的出现,小数点的出现以及e值的出现进行记录。分别使用布尔类型的三个变量:sign,dot,hasE。接下来分析四种特殊情况:

  1)对于符号位'+'和'-'的出现的判断:只能出现在字符串的第一位或e/E的后面第一位。

  2)对于e/E的出现判断:不能出现两次或出现在字符串的最后一位。

  3)对于'.'的出现判断:不能出现两次,不能出现在字符串的最后一位,不能出现的e/E之后。

  4)对于其他字符,只要不是0到9的数字就出错。

根据上述的特殊情况,对字符串进行一次遍历,当顺利完成遍历即为满足条件的字符串。

2. 第二种思路,是将整个字符串的形式进行了拆分,可以形式化表示为A[.[B]][e|EC],其中A,B,C表示数字,“|”表示或,[]表示可有可无的部分。

在数值之前可能有一个表示正负的'+'或者'-'。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。如果数值是一个小数,那么在小数后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学记数法表示,接下来是一个'e'或者'E',以及紧跟着的一个整数(可以有正负号)表示指数。

这一部分对于字符串的遍历使用了指针,比较灵活,要注意理解p,*p,&p以及**p之间的区别。以及函数调用的过程指针的变化。

代码:

思路一:

 class Solution {
public:
bool isNumeric(char* string)
{
if(string==nullptr)
return false;
bool sign=false, dot=false, hasE=false;
for(int i=; i<strlen(string); i++)
{
if(string[i]=='+' || string[i]=='-')
{
if(!sign && i!= && string[i-]!='e' && string[i-]!='E')
return false;
else if(sign && string[i-]!='e' && string[i-]!='E')
return false;
sign = true;
}
else if(string[i]=='e' || string[i]=='E')
{
if(hasE || strlen(string)- == i)
return false;
hasE = true;
}
else if(string[i] == '.')
{
if(dot || strlen(string)-==i || hasE)
return false;
dot = true;
}
else if(string[i]>'' || string[i]<'')
return false;
}
return true;
} };

思路二:

 class Solution {
public:
bool isNumeric(char* string)
{
if(*string=='\0' || string==nullptr)
return false;
bool res = true;
if(*string == '+' || *string == '-')
string++;
isDigtal(&string);
if(*string!='\0')
{
if(*string == '.')
{
string++;
isDigtal(&string);
if(*string == 'e' || *string == 'E')
res = isExponential(&string);
}
else if(*string == 'e' || *string == 'E')
res = isExponential(&string);
else
res = false;
}
return res && *string=='\0';
} private:
void isDigtal(char** string)
{
while(**string !='\0' && **string>='' && **string<='')
{
(*string)++;
}
} bool isExponential(char** string)
{
(*string)++;
if(**string=='+' || **string=='-')
(*string)++;
if(**string == '\0')
return false;
isDigtal(string);
return (**string == '\0') ? true : false;
} };

剑指offer:表示数值的字符串的更多相关文章

  1. 剑指Offer——表示数值的字符串

    题目描述: 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3. ...

  2. 《剑指offer》 数值的整数次方

    本题来自<剑指offer> 数值的整数次方 题目: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路: 代码从三个方面处 ...

  3. 剑指offer 1,输入一个字符串,将字符串的空格替换成%20

    剑指offer 1,输入一个字符串,将字符串的空格替换成%20    function replaceSpace(str){      return str.replace(/\s/g,"% ...

  4. 剑指Offer - 九度1369 - 字符串的排列

    剑指Offer - 九度1369 - 字符串的排列2014-02-05 21:12 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所 ...

  5. 【剑指Offer】数值的整数次方 解题报告(Python)

    [剑指Offer]数值的整数次方 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  6. 【剑指Offer】左旋转字符串 解题报告(Python)

    [剑指Offer]左旋转字符串 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  7. 剑指offer(27)字符串的排列

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入 ...

  8. 【Java】 剑指offer(15) 数值的整数次方

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 实现函数double Power(double base, int ...

  9. 【Java】 剑指offer(58-2) 左旋转字符串

      本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部 ...

  10. (3)剑指Offer之数值的整数次方和调整数组元素顺序

    一 数值的整数次方 题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 问题解析: 这道题算是比较麻烦和难一点的一个了.我这里采 ...

随机推荐

  1. JS基础 —— call、apply 和 bind

    函数的三个原型方法 作用:改变this指向 call MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Glo ...

  2. jQuery函数与对象(一)

    一.jQuery函数jQuery函数的两种表现形式:1.jQuery()2.$()说明:在jQuery中使用jQuery()与$()是等价的,一般情况下均使用$() jQuery函数中可以存放的四种参 ...

  3. Java集合学习(5):LinkedHashMap

    一.概述 HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方.所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟 ...

  4. 微信分享接口的java开发的一些小步骤

    1.配置接口信息进行验证 代码如下: /**     * 访问没认证的地址跳转     *     * @param request     * @return 登录页面     * @throws ...

  5. Nginx 反向代理与负载均衡的配置

    已经很久没有写博了,因为最近学车加上各种问题一直没时间, 今天刚好想起有好多的东西还没来得及记录.回到正题: Nginx是一个非常强大的web轻量级服务器,许多大厂也用Nginx进行负载均衡和反向代理 ...

  6. 常用内置模块(二)--logging、hashlib、shelve、xml、configparser

    一.logging模块 1.logging作用 1. 控制日志级别  2. 控制日志格式  3. 控制输出的目标为文件 2.日志级别 1 logging.debug( 2 logging.info( ...

  7. SaltStack--远程执行

    saltstack远程执行 安装完Saltstack后可以立即执行shell命令,更新软件包并将文件同时分不到所有受管系统.所有回复都以一致的可配置格式返回.远程执行参考文档:http://docs. ...

  8. zabbix--告警消息内容更改

    zabbix 告警消息内容更改 自带的消息内容模板发送出来的消息着实有点丑陋,再加之是英文,这就让我有点尴尬了. 如下默认的消息内容: 更改过后的效果: 操作步骤 编辑默认的Report proble ...

  9. Pytorch之Dataparallel源码解析

    之前对Pytorch 1.0 的Dataparallel的使用方法一直似懂非懂,总是会碰到各种莫名其妙的问题,今天就好好从源头梳理一下,更好地理解它的原理或者说说下步骤. 源码地址: https:// ...

  10. VC检测内存泄漏(Detected memory leaks!)

    Detected memory leaks!Dumping objects ->{98500} normal block at 0x05785AD0, 152 bytes long.Data: ...