【问题描述】[中等]

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

【解答思路】

1. 标记多状态

时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public boolean isNumber(String s) {if(s == null || s.length() == 0){return false;}//标记是否遇到相应情况boolean numSeen = false;boolean dotSeen = false;boolean eSeen = false;char[] str = s.trim().toCharArray();for(int i = 0;i < str.length; i++){if(str[i] >= '0' && str[i] <= '9'){numSeen = true;}else if(str[i] == '.'){//.之前不能出现.或者eif(dotSeen || eSeen){return false;}dotSeen = true;}else if(str[i] == 'e' || str[i] == 'E'){//e之前不能出现e,必须出现数if(eSeen || !numSeen){return false;}eSeen = true;numSeen = false;//重置numSeen,排除123e或者123e+的情况,确保e之后也出现数}else if(str[i] == '-' || str[i] == '+'){//+-出现在0位置或者e/E的后面第一个位置才是合法的if(i != 0 && str[i-1] != 'e' && str[i-1] != 'E'){return false;}}else{//其他不合法字符return false;}}return numSeen;}
}
2. 状态机




时间复杂度:O(N) 空间复杂度:O(1)

class Solution {public boolean isNumber(String s) {Map[] states = {new HashMap<>() {{ put(' ', 0); put('s', 1); put('d', 2); put('.', 4); }}, // 0.new HashMap<>() {{ put('d', 2); put('.', 4); }},                           // 1.new HashMap<>() {{ put('d', 2); put('.', 3); put('e', 5); put(' ', 8); }}, // 2.new HashMap<>() {{ put('d', 3); put('e', 5); put(' ', 8); }},              // 3.new HashMap<>() {{ put('d', 3); }},                                        // 4.new HashMap<>() {{ put('s', 6); put('d', 7); }},                           // 5.new HashMap<>() {{ put('d', 7); }},                                        // 6.new HashMap<>() {{ put('d', 7); put(' ', 8); }},                           // 7.new HashMap<>() {{ put(' ', 8); }}                                         // 8.};int p = 0;char t;for(char c : s.toCharArray()) {if(c >= '0' && c <= '9') t = 'd';else if(c == '+' || c == '-') t = 's';else t = c;if(!states[p].containsKey(t)) return false;p = (int)states[p].get(t);}return p == 2 || p == 3 || p == 7 || p == 8;}
}

【总结】

1.分情况讨论一定要细致 安排得明明白白
2. 状态机有利于多情况讨论

转载链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/mian-shi-ti-20-biao-shi-shu-zhi-de-zi-fu-chuan-y-2/

参考链接:https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/javaban-ben-ti-jie-luo-ji-qing-xi-by-yangshyu6/

[剑指offer][JAVA]面试题第[20]题[表示数值的字符串][状态机]相关推荐

  1. [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]

    [问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...

  2. [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]

    [问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...

  3. [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]

    [问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...

  4. [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]

    [问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...

  5. [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]

    [问题描述][中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,给出前序遍历 preorder = [3,9,20,15,7] ...

  6. [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer]

    [问题描述][简单] 请实现一个函数,把字符串 s 中的每个空格替换成"%20".示例 1:输入:s = "We are happy." 输出:"We ...

  7. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

  8. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  9. [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]

    [问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...

最新文章

  1. fpga该驱动器调试dev_dbg 无输出
  2. iOS UIScrollView的简单使用
  3. 微信8.0.6正式发布,新增了7大变化,个个实用~
  4. python基础网易_十年Python大牛花了三天总结出来的python基础知识实例,超详细!...
  5. CodePush 管理工具 App Center Cli 的常用命令行
  6. eclipse(或者myeclipse)常用配置方法
  7. Spring循环依赖的三种方式
  8. Shell第二篇:正则表达式和文本处理工具
  9. mysql面试吗hi提_面试必备的10道MySQL题
  10. eclipse下的jrebel配置
  11. linux内核的nfs实现框架
  12. 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)
  13. 常用数据库的字段类型及大小
  14. java wmic_Windows WMIC命令使用详解(附实例)
  15. 人生最大的难题是认清自己
  16. mysql got error 1045_mysqldump 备份的问题Got error: 1045、ERROR 1045 (28000)、Got error: 1449
  17. 餐厅小票打印模板_智慧餐厅多商家入驻小程序开发,成功案例:万足外卖!
  18. ldo和dcdc功耗_LDO与DC-DC对比分析
  19. 虚幻四学习笔记(2)—— 学习途径
  20. 搭建用户增长体系,这5个方法告诉你怎么做

热门文章

  1. Delphi XE10编写的《开放式公路收费系统》
  2. ado.net操作数据库
  3. CLR线程概览(一)
  4. 用nodejs 替换文件中所有图片的url
  5. C# MVC的博客开发(三)注册
  6. PMP读书笔记(第10章)
  7. PMP读书笔记(第8章)
  8. Python爬虫自学之第(⑤)篇——爬取某宝商品信息
  9. vue使用axios并存数据到state
  10. 微信新的用户信息接口wx.getUserProfile,返回信息解密失败