题目

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

解题思路

有限状态自动机。正好复习下有限状态自动机的方法。DFA的基本方法是使用一个while死循环,作为底层驱动,然后有个状态标记再各个状态之间进行变换。这类题目的难点往往在于如何正确的划分各个状态。下面给出本题目的状态图:

核心的思想在于,区分了各种类型数据和符号的状态

AC代码

class Solution {public:enum STATE { START, INT, SIGNED1, POINT, EXP, FLOAT, SCIENCE, SIGNED2 };bool isNumeric(char* str){if (str == nullptr) {return false;}STATE state = STATE::START;int i = 0;while (true) {switch (state){case STATE::START:if (str[i] == '+' || str[i] == '-') {state = STATE::SIGNED1;}else if (isdigit(str[i])) {state = STATE::INT;}else if (str[i] == '.') {state = STATE::POINT;}else {return false;}break;case STATE::SIGNED1:if (str[i] == '.') {state = STATE::POINT;}else if (isdigit(str[i])) {state = STATE::INT;}else {return false;}break;case STATE::POINT:if (isdigit(str[i])) {state = STATE::FLOAT;} else {return false;}break;case STATE::INT:if (isdigit(str[i])) {state = STATE::INT;}else if (str[i] == '\0') {  // 结束状态return true;}else if (str[i] == '.') {state = STATE::FLOAT;}else if (str[i] == 'E' || str[i] == 'e') {state = STATE::EXP;}else {return false;}break;case STATE::FLOAT:if (isdigit(str[i])) {state = STATE::FLOAT;}else if (str[i] == 'e' || str[i] == 'E') {state = STATE::EXP;}else if (str[i] == '\0') {return true;}else {return false;}break;case STATE::EXP:if (str[i] == '+' || str[i] == '-') {state = STATE::SIGNED2;}else if (isdigit(str[i])) {state = STATE::SCIENCE;}else {return false;}break;case STATE::SCIENCE:if (isdigit(str[i])) {state = STATE::SCIENCE;}else if (str[i] == '\0') {return true;}else {return false;}break;case STATE::SIGNED2:if (isdigit(str[i])) {state = STATE::SCIENCE;}else {return false;}break;default:return false;}++i;  // 移动指针}}};

剑指offer之表示数值的字符串相关推荐

  1. 【LeetCode】剑指 Offer 20. 表示数值的字符串

    [LeetCode]剑指 Offer 20. 表示数值的字符串 文章目录 [LeetCode]剑指 Offer 20. 表示数值的字符串 package offer;import java.util. ...

  2. 剑指offer:表示数值的字符串

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

  3. 剑指offer:表示数值的字符串cpp题解:指针

    文章目录 题目来源 分析 题意:需要判断是小数和科学计数法. 这里的奇淫巧计是:e之前必须是数(小数或者整数):e后面需要是整数(可以有符号位) 这就启发我们:用一个指针i,从前往后遍历,确定是否是数 ...

  4. leetcode剑指 Offer 20. 表示数值的字符串

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

  5. 【LeetCode笔记】剑指 Offer 20. 表示数值的字符串(Java、字符串)

    文章目录 题目描述 思路 && 代码 题目描述 呃-比较恶心的一道题,需要读好题,分完情况再下手 有看到dalao用有限状态机来做,不过这边还是直接用了我自己的做法= = 思路 &am ...

  6. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串

    [LeetCode]剑指 Offer 58 - II. 左旋转字符串 文章目录 [LeetCode]剑指 Offer 58 - II. 左旋转字符串 一.字符串切片 二.列表遍历拼接 三.字符串遍历拼 ...

  7. 剑指 Offer II 117. 相似的字符串

    链接:剑指 Offer II 117. 相似的字符串 题解: 1.建设图 2.bfs遍历 class Solution { public:int numSimilarGroups(vector< ...

  8. 剑指offer——面试题28:字符串的排列

    剑指offer--面试题28:字符串的排列 Solution1: 2018年9月2日重做 典型的DFS套路,LeetCode 46 && 47 [46]https://blog.csd ...

  9. 算法Day8|字符串专题二 剑指 Offer 58 - II. 左旋转字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

    剑指 Offer 58 - II. 左旋转字符串 解题思路: 反转区间为前n的子串 反转区间为n到末尾的子串 反转整个字符串 class Solution {public String reverse ...

最新文章

  1. Go 1.9 新特性
  2. 第二章 如何学习Linux(鸟哥的Linux私房菜基础学习篇)
  3. feign 第一次调用超时_Feign ,3步搞定 HTTP 请求
  4. cmd 删除文件夹_永远不要碰的5个macOS文件夹及原因
  5. 让自己的user能够看到S4 product master这个tile
  6. php抽奖概率算法(刮刮卡,大转盘)
  7. WSDM Cup 2020大赛金牌参赛方案全解析
  8. linux 的学习笔记-linux 指令大全
  9. 神经网络的理解和计算
  10. java 常用富文本编辑器_常用的六个富文本编辑器
  11. PowerDesigner关联表结构表示一对一或一对多
  12. 在ArcMap中制作Python加载项点击小班依次编号
  13. 副业刚需——做哪些自媒体确实可以挣到钱?
  14. 微信公众号批量打标签的自动化实现方法
  15. Zotero-word中引用跳转到参考文献/建立超链接-引用格式(Xie et al 2021, Achanta et al 2012)
  16. java唱哪首歌好听_非常适合KTV演唱的100首新歌,Hold住全场,非常好听!
  17. ACRush 楼天城 回忆录
  18. c# AutoCAD 操作交互
  19. SAP 固定资产减值准备的处理方法
  20. UVA-12627(考眼力~)

热门文章

  1. table合并单元格_element ui el-table 合并单元格
  2. 【转】VO BO PO 介绍
  3. ESP32-IDF给FATFS添加长文件名支持,更改_USE_LFN以支持大于8.3格式的文件名
  4. MDK、keil复制中文注释乱码
  5. ROS学习笔记五:理解ROS topics
  6. 后期处理之一:雾蒙蒙风景照片处理技巧
  7. 机器学习与python实战(一)-k近邻
  8. IT职场人生系列之十五:语言与技术II
  9. Spring Cloud 服务消费者 Feign (三)
  10. 第 4 章 部署 Enterprise Library