[剑指offer][JAVA]面试题第[20]题[表示数值的字符串][状态机]
【问题描述】[中等]
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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]题[表示数值的字符串][状态机]相关推荐
- [剑指offer][JAVA]面试题第[32-3]题[从上到下打印二叉树 ][BFS]
[问题描述][中等] 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3 ...
- [剑指offer][JAVA]面试题第[32-2]题[从上到下打印二叉树][BFS]
[问题描述][简单] 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行.例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 ...
- [剑指offer][JAVA]面试题第[32-1]题[从上到下打印二叉树][BFS]
[问题描述][中等] 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: ...
- [剑指offer][JAVA]面试题第[31]题[栈的压入、弹出序列][栈]
[问题描述][中等] 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4 ...
- [剑指offer][JAVA]面试题第[07]题[重建二叉树][递归]
[问题描述][中等] 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,给出前序遍历 preorder = [3,9,20,15,7] ...
- [剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer]
[问题描述][简单] 请实现一个函数,把字符串 s 中的每个空格替换成"%20".示例 1:输入:s = "We are happy." 输出:"We ...
- [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]
[问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...
- [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]
[问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...
- [剑指offer][JAVA]面试题第[16]题[数值的整数次方][位运算][二分法]
[问题描述][中等] 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题.示例 1:输入: ...
最新文章
- fpga该驱动器调试dev_dbg 无输出
- iOS UIScrollView的简单使用
- 微信8.0.6正式发布,新增了7大变化,个个实用~
- python基础网易_十年Python大牛花了三天总结出来的python基础知识实例,超详细!...
- CodePush 管理工具 App Center Cli 的常用命令行
- eclipse(或者myeclipse)常用配置方法
- Spring循环依赖的三种方式
- Shell第二篇:正则表达式和文本处理工具
- mysql面试吗hi提_面试必备的10道MySQL题
- eclipse下的jrebel配置
- linux内核的nfs实现框架
- 征服 Redis + Jedis + Spring (一)—— 配置常规操作(GET SET DEL)
- 常用数据库的字段类型及大小
- java wmic_Windows WMIC命令使用详解(附实例)
- 人生最大的难题是认清自己
- mysql got error 1045_mysqldump 备份的问题Got error: 1045、ERROR 1045 (28000)、Got error: 1449
- 餐厅小票打印模板_智慧餐厅多商家入驻小程序开发,成功案例:万足外卖!
- ldo和dcdc功耗_LDO与DC-DC对比分析
- 虚幻四学习笔记(2)—— 学习途径
- 搭建用户增长体系,这5个方法告诉你怎么做