题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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. GoLang 中用 MongoDB Watch 监听指定字段的变化

    需要 MongoDB 3.6 及以上, 需要 ReplicaSet 模式. 监听一个字段的变化: func watch(coll *mongo.Collection) { match := bson. ...

  2. Java 数组实例——将阿拉伯数字转换为最大写

    题目:将阿拉伯数字转换为最大写,比如1234转换为壹仟贰佰叁拾肆. package my_package; public class Transform { private String[] arr1 ...

  3. Python数据预处理之清及

    使用Pandas进行数据预处理 数据清洗中不是每一步都是必须的,按实际需求操作. 内容目录 1.数据的生成与导入 2.数据信息查看 2.1.查看整体数据信息 2.2.查看数据维度.列名称.数据格式 2 ...

  4. C#控制多线程最大并行数量

  5. ORM概述(对象关系映射)

    ORM概述: ORM(Object-Relational Mapping)表示对象关系映射.在面向对象的软件开发中,通过ORM,就可以把对象映射到关系型数据库中.只要有一套程序能够做到加你对象与数据库 ...

  6. xz格式解压

    1.安装xz命令 yum install xz -y 2.将xz文件解压为tar文件 xz -d example.tar.xz 3.将tar文件解压 tar xf example.tar 如果无法安装 ...

  7. Mysql的安装与环境的配置

    Mysql的安装与环境的配置 这里以Mysql5.5为例: (1)双击安装包,点击next (2)选择自定义,点击Next (3)修改路径,点击Next (4)选择精确配置,点击Next (5)选择开 ...

  8. 微服务学习之路(三)——实现RPC远程服务调用

    RPC(Remote Producedure Call)调用原理:服务消费者称为客户端,服务提供者称为服务端,处于不同网络地址,需要建立网络连接.建立连接后,双方还必须按照某种约定的协议进行网络通讯— ...

  9. iOS开源库分类

    语言库 rx aop kvo 功能库 UI network data-model-map cache 跨平台库 wkjscorebridge jspatch 性能监控库:友盟 部署库:jspathc ...

  10. 浏览器渲染详细过程:重绘、重排和 composite 只是冰山一角

    https://juejin.im/entry/590801780ce46300617c89b8 渲染 这张很经典的图许多人都看过,其中的概念大家应该都很熟悉,也就是这么几个步骤:js修改dom结构或 ...