LeetCode 0065 Valid Number
2022/4/9 6:19:18
本文主要是介绍LeetCode 0065 Valid Number,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
原题传送门
1. 题目描述
2. Solution 1
1、思路分析
All we need is to have a couple of flags so we can process the string in liner time:
We start with trimming.
If we see [0-9]
we reset the number flags.
We can only see .
if we didn't see e
or .
We can only see e
if we didn't see e
but we did see a number. We reset numberAfterE flag.
We can only see + and - in the beginning and after an e
any other character break the validation.
At the end it is only valid if there was at least 1 number and if we did see an e then a number after it as
well.
2、代码实现
package Q0099.Q0065ValidNumber; public class Solution { /* All we need is to have a couple of flags so we can process the string in liner time: We start with trimming. If we see `[0-9]` we reset the number flags. We can only see `.` if we didn't see `e` or `.` We can only see `e` if we didn't see `e` but we did see a number. We reset numberAfterE flag. We can only see + and - in the beginning and after an e any other character break the validation. At the end it is only valid if there was at least 1 number and if we did see an e then a number after it as well. So basically the number should match this regular expression: [-+]?(([0-9]+(.[0-9]*)?)|.[0-9]+)(e[-+]?[0-9]+)? The 'numberAfterE' is unnecessary. */ public boolean isNumber(String s) { s = s.trim().toLowerCase(); boolean pointSeen = false; boolean eSeen = false; boolean numberSeen = false; for (int i = 0; i < s.length(); i++) { if ('0' <= s.charAt(i) && s.charAt(i) <= '9') { numberSeen = true; } else if (s.charAt(i) == '.') { if (eSeen || pointSeen) return false; pointSeen = true; } else if (s.charAt(i) == 'e') { if (eSeen || !numberSeen) return false; numberSeen = false; eSeen = true; } else if (s.charAt(i) == '-' || s.charAt(i) == '+') { if (i != 0 && s.charAt(i - 1) != 'e') return false; } else { return false; } } return numberSeen; } }
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)
3. Solution 2
package Q0099.Q0065ValidNumber; public class Solution2 { public boolean isNumber(String s) { return s.trim().matches("[-+]?(\\d+\\.?|\\.\\d+)\\d*([e|E][-+]?\\d+)?"); } }
4. Solution 3
1、思路分析
DFA: Deterministic Finite Automaton 确定有限状态自动机
States
0: initial
1: only dot
2: number
3: sign
4: dot number
5: e
6: e sign
7: e number
8: end
9: fail
Inputs 0: others 1: space 2: dot 3: numbers 4: sign 5: e
2、代码实现
package Q0099.Q0065ValidNumber; import java.util.Arrays; import java.util.List; /* DFA: Deterministic Finite Automaton 确定有限状态自动机 States 0: initial 1: only dot 2: number 3: sign 4: dot number 5: e 6: e sign 7: e number 8: end 9: fail Inputs 0: others 1: space 2: dot 3: numbers 4: sign 5: e */ public class Solution3 { boolean isNumber(String s) { int state = 0; int[][] transitions = { // 0, 1, 2, 3, 4, 5 {9, 0, 1, 2, 3, 9}, // 0 {9, 9, 9, 4, 9, 9}, // 1 {9, 8, 4, 2, 9, 5}, // 2 {9, 9, 1, 2, 9, 9}, // 3 {9, 8, 9, 4, 9, 5}, // 4 {9, 9, 9, 7, 6, 9}, // 5 {9, 9, 9, 7, 9, 9}, // 6 {9, 8, 9, 7, 9, 9}, // 7 {9, 8, 9, 9, 9, 9}, // 8 {9, 9, 9, 9, 9, 9} // 9 }; for (int i = 0; i < s.length(); i++) { int input = getInput(s.charAt(i)); state = transitions[state][input]; if (state == 9) return false; } List<Integer> accepts = Arrays.asList(2, 4, 7, 8); return accepts.contains(state); } private int getInput(char c) { if (c == ' ') return 1; if (c == '.') return 2; if (c >= '0' && c <= '9') return 3; if (c == '+' || c == '-') return 4; if (c == 'e' || c == 'E') return 5; return 0; } }
3、复杂度分析
时间复杂度: O(n)
空间复杂度: O(1)
这篇关于LeetCode 0065 Valid Number的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升
- 2024-05-08代码报错不用愁,CodeGeeX一键完成代码修复、错误解释的功能上线了!
- 2024-05-08今天开始程序员不用再发愁写commit message了,全部由CodeGeeX自动完成!