题目:

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

但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路:

表示数值的字符串遵循如下模式:

[sign]integral-digits[.[fractional-digit]][e|E[sign]exponential-digits]

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

判断一个字符串是否满足上述模式,首先看第一个字符是否为正负符号,如果是在字符串往前移动一个字符,继续扫描字符串剩下中0-9的位数,如果是一个小数,则将遇到小数点,如果是科学计数法,在整数或者小数后面可能会遇到‘e’或‘E’.

代码:

#include <iostream>
#include <string.h>using namespace std;void scanDigits(char** string){while(**string!='\0' && **string>='0' && **string<='9')++(*string);
}bool isExponential(char** string){if(**string!='e' && **string!='E')return false;++(*string);if(**string=='+' || **string=='-')++(*string);if(**string=='\0')return false;scanDigits(string);return (**string=='\0')?true:false;
}bool isNumeric(char* string){if(string==NULL)return false;if(*string=='+' || *string=='-')++string;if(*string=='\0')return false;bool numeric=true;scanDigits(&string);if(*string!='\0'){if(*string=='.'){++string;scanDigits(&string);if(*string=='e' || *string=='E')numeric=isExponential(&string);}else if(*string=='e' || *string=='E')numeric=isExponential(&string);elsenumeric=false;}return numeric && *string=='\0';
}int main()
{cout << isNumeric("5e2") << endl;cout << isNumeric("12e") << endl;cout << isNumeric("1a3.14") << endl;cout << isNumeric("+-5") << endl;return 0;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/6f8c901d091949a5837e24bb82a731f2?rp=3

AC代码:

class Solution {
public:bool isNumeric(char* string){if(string==NULL)return false;int len=strlen(string);int index=0;if(string[index]=='+' || string[index]=='-')++index;if(index>=len)return false;bool numeric=true;scanDigit(string,index);if(index<len){if(string[index]=='.'){++index;scanDigit(string,index);if(index>=len)numeric=true;else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}else if(string[index]=='e' || string[index]=='E')numeric=isExponential(string,index);elsenumeric=false;}return numeric;      }void scanDigit(char* string,int& index){while(string[index]!='\0' && string[index]>='0' && string[index]<='9')++index;}bool isExponential(char* string,int index){if(string[index]!='e' && string[index]!='E')return false;++index;if(string[index]=='+' || string[index]=='-')++index;if(string[index]=='\0')return false;scanDigit(string,index);return (string[index]=='\0')?true:false;}};

  

(剑指Offer)面试题54:表示数值的字符串相关推荐

  1. 剑指offer面试题[54]-表示数值的字符串

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

  2. 剑指offer——面试题54:表示数值的字符串

    剑指offer--面试题54:表示数值的字符串 参考网址:https://www.nowcoder.com/profile/9717187/codeBookDetail?submissionId=15 ...

  3. 剑指offer——面试题11:数值的整数次方

    剑指offer--面试题11:数值的整数次方 Solution1:基本算法 累乘,时间复杂度为O(n) 要考虑全部情况:指数 < 0, == 0 和 > 0. 注意在 if-else if ...

  4. 剑指offer——面试题42-1:左旋转字符串

    剑指offer--面试题42-1:左旋转字符串 20180906整理 Solution1: 自己最开始想出来的垃圾算法!!! class Solution {public:string LeftRot ...

  5. 剑指offer | 面试题54:二叉搜索树的第k大节点

    转载本文章请标明作者和出处 本文出自<Darwin的程序空间> 本文题目和部分解题思路来源自<剑指offer>第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 给定 ...

  6. @ 剑指offer(python)表示数值的字符串

    剑指offer刷题笔记53(python) 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2",&quo ...

  7. 剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

    1. 题目 给定一棵二叉搜索树,请找出其中第k大的节点. 示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4示例 2: 输入: root = [ ...

  8. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...

  9. [剑指offer]面试题第[38]题[JAVA][字符串的排列][回溯法]

    [问题描述][中等] 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素.示例: 输入:s = "abc" 输出:[&quo ...

  10. 剑指Offer - 面试题58 - II. 左旋转字符串

    1. 题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转 ...

最新文章

  1. android相对布局底部对齐,Android,在edittext中输入时防止相对布局底部对齐的按钮向上移动...
  2. Lambda表达式和匿名内部类的区别【理解】
  3. ubuntu16.04+Virtualenv+python2.7+Caffe安装(CPU版本,无opencv)
  4. python 学习笔记(十二) 文件和序列化
  5. 23种设计模式 UML 类图及对应示例代码 (二)
  6. php中怎样表示组合框,php – 如何实现动态组合框选择系统
  7. RHE5服务器配置——Samba服务器
  8. Bootstrap学习(二)
  9. 【转】C语言中的符号优先级
  10. 云消防大数据_消防云大数据
  11. jQuery 图表插件 jqChart 使用
  12. 网络工程师HCIE-RS-ipv6第一节:IPv6地址(原理+实验)
  13. Screaming Frog SEO Spider for Mac(网络爬虫软件)v16.0
  14. K8s宣布弃用Docker?千万别慌!
  15. 最近啃的有点多了,乱了
  16. myeclipse 8.0GA 安装注册步骤
  17. FPGA 可编程性与布局布线原理探究
  18. win10 jungo windriver
  19. idea为什么不显示运行按钮_idea 右键项目没有run 运行选项
  20. Excel函数带你看透身份证号

热门文章

  1. Apache的prefork模式和worker模式
  2. RapidJSON简介及使用
  3. 对象检测工具包mmdetection简介、安装及测试代码
  4. 激活函数之softmax介绍及C++实现
  5. centos7镜像加速_虚拟机 Linux CentOS7 安装Docker 详解:使用 阿里云Yum源;附加云镜像加速器...
  6. 神舟台式计算机图片,扩展性媲美台式机!神舟战神K780G拆机图赏
  7. 7.1 pdo 宝塔面板php_记宝塔面板中 PHP升级到 7.3.16安全版本概要
  8. python好不好用_python应用情况怎么样?是否真的值得学习?
  9. 2020版北大核心期刊目录_榜单|2020武大版核心期刊RCCSE高职高专成高院校学报类自然科学综合、社会科学综合学科权威、核心及准核心期刊目录...
  10. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?