题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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. zynq开发板外设配置演示

    有幸得到米尔电子zynq系列开发板Z-turn Board试用体验,下面说说我这款zynq系列的Z-TURN板子外设配置.从Z-turn Board原理图上看,目前可以配置的FPGA管脚大概有100多 ...

  2. 如何显示IntelliJ IDEA工具的Run Dashboard功能(转)

    从 JetBrains released IntelliJ IDEA 2017.2.1 版本之后,新出的功能‘Run Dashboard,它能非常方便的提供开发人员查看本地springboot服务运行 ...

  3. 19道常见的JS面试算法题

    最近秋招也做了多多少少的面试题,发现除了基础知识外,算法还是挺重要的.特意整理了一些常见的算法题,添加了自己的理解并实现. 除此之外,建议大家还可以刷刷<剑指offer>.此外,左神在牛客 ...

  4. 汽车制造商表态:必须依靠MES系统来管控流程

    汽车行业特点 汽车工业是一个高投入,高产出,集群式发展的产业部门. 汽车自身的投资,生产,研发,供应,销售,维修:前序的原材料,零部件,技术装备,物流:后序的油料,服务,信贷,咨询,保险,直至基础设施 ...

  5. 对Sql Server执行计划的浅显了解。

    一名大三的小学生,今天开始我的第一篇博客,最近随便做了一个简易的酒店管理系统,对sql执行计划有了初步的了解. 查看上面语句的预估执行计划,在工具栏中有这个按钮 聚集索引扫描被称为Index Scan ...

  6. Spark排序方式集锦

    一.简介 spark中的排序一般可以使用orderBy或sort算子,可以结合负号.ASC/DESC和col进行简单排序.二次排序等情况 二.代码实现 package big.data.analyse ...

  7. warning警告问题解决1

    warning警告问题, 这时可以不去管它, 但如果想解决, 可以这样做: c:\python\lib\site-packages\locust\core.py:17: MonkeyPatchWarn ...

  8. 【Netty】Netty的Hello World程序之Discard Server

    一.有关Discard Server的说明 世界上最简单的协议(程序)不是“Hello, World!”而是Discard(丢弃).它是一种丢弃任何接收到的数据而没有任何响应的协议. 要实现丢弃协议, ...

  9. HDFS 配额教程

    本文原始地址:https://sitoi.cn/posts/12544.html 名称配额(Name Quota) 名称配额是在对应的目录下所有文件和目录名称的数量上的限制. 当超过这个配额的时候,文 ...

  10. Example-based Machine Learning是什么?

    参考:https://christophm.github.io/interpretable-ml-book/proto.html EML简介 Example-based Machine Learnin ...