leetcode — valid-number
/**
*
* Source : https://oj.leetcode.com/problems/valid-number/
*
*
* Validate if a given string is numeric.
*
* Some examples:
* "0" => true
* " 0.1 " => true
* "abc" => false
* "1 a" => false
* "2e10" => true
*
* Note: It is intended for the problem statement to be ambiguous.
* You should gather all requirements up front before implementing one.
*
*/
public class ValidNumber {
/**
* 判断一个字符串是不是一个合法的数字
*
* 重要的是要考虑多种情况
* 空白:可以出现多次,可能出现在首尾、中间,先去掉首尾,中间如果出现则不是数字
* 小数点:可以出现在开头(后面必须有数字)、中间(只能出现在e前面)、最后,但是不能不出现在E后面
* E: 只能出现一次,前后必须有数字,
* 正负号:可以出现两次,可以在开头出现,在E后出现
*
* @param str
* @return
*/
public boolean valid (String str) {
int startIndex = 0;
int endIndex = str.length() - 1;
// 去除开头空白
while (isWhiteSpace(str.charAt(startIndex))) {
startIndex ++;
if (startIndex > endIndex) {
return false;
}
}
// 去除末尾空白
while (isWhiteSpace(str.charAt(endIndex))) {
endIndex --;
if (startIndex > endIndex) {
return false;
}
}
// 去除开头符号
if (str.charAt(startIndex) == '+' || str.charAt(startIndex) == '-') {
startIndex ++;
}
if (startIndex > endIndex) {
return false;
}
int head = startIndex;
boolean hasPoint = false;
boolean hasE = false;
while (startIndex <= endIndex) {
char ch = str.charAt(startIndex);
// 中间出现空白
if (isWhiteSpace(ch)) {
return false;
}
if (ch == '.') {
// 小数点只出现一次,e后除了末尾不能出现小数(如果后不能紧接着出现小数点),不能只有小数点
if ((hasE && (startIndex != endIndex)) || (hasE && (startIndex != endIndex
|| (startIndex > head && str.charAt(startIndex-1) == 'e')))
|| (head == startIndex && startIndex == endIndex)) {
return false;
}
hasPoint = true;
} else if (ch == 'e') {
// 前后必须有数字
if (hasE || startIndex == head || startIndex == endIndex) {
return false;
}
hasE = true;
} else if (ch == '+' || ch == '-') {
// 中间出现符号,必须紧跟在E后面,不能出现在最后,如果是倒数第二位,最后一位不能出现小数点
if (!hasE || (str.charAt(startIndex-1) != 'e') || startIndex == endIndex
|| (startIndex == endIndex - 1 && str.charAt(startIndex + 1) == '.')) {
return false;
}
} else if (!isNumber(ch)) {
return false;
}
startIndex ++;
}
return true;
}
private boolean isNumber (char ch) {
if (ch >= 48 && ch <= 57) {
return true;
}
return false;
}
private boolean isWhiteSpace (char ch) {
if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '\f') {
return true;
}
return false;
}
public static void main(String[] args) {
ValidNumber validNumber = new ValidNumber();
System.out.println("true------>" + validNumber.valid("-123.0e-5."));
System.out.println("false------>" + validNumber.valid("1e-. "));
System.out.println("true------>" + validNumber.valid("-123.0e-5"));
System.out.println("true------>" + validNumber.valid("1.044"));
System.out.println("true------>" + validNumber.valid(" 1.044"));
System.out.println("true------>" + validNumber.valid(" 1.044 "));
System.out.println("false------>" + validNumber.valid(" 1. 044 "));
System.out.println("false------>" + validNumber.valid(" 1.a "));
System.out.println("true------>" + validNumber.valid(" 1. "));
System.out.println("false------>" + validNumber.valid(" abc "));
System.out.println("false------>" + validNumber.valid("e "));
System.out.println("false------>" + validNumber.valid("1e. "));
System.out.println("true------>" + validNumber.valid("+123.0"));
System.out.println("true------>" + validNumber.valid("-123.0"));
System.out.println("true------>" + validNumber.valid("-123.0e5"));
System.out.println("true------>" + validNumber.valid("0"));
System.out.println("true------>" + validNumber.valid("0.1"));
System.out.println("true------>" + validNumber.valid(".1"));
System.out.println("true------>" + validNumber.valid(".1e1"));
System.out.println("true------>" + validNumber.valid("2e10"));
}
}
leetcode — valid-number的更多相关文章
- LeetCode: Valid Number 解题报告
Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 ...
- [LeetCode] Valid Number 验证数字
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- [leetcode]Valid Number @ Python
原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...
- LeetCode——Valid Number
Validate if a given string is numeric. Some examples: "0" => true " 0.1 " =&g ...
- Leetcode Valid Number
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- LeetCode Valid Number 有效数字(有限自动机)
题意:判断一个字符串是否是一个合法的数字,包括正负浮点数和整形. 思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已. 下面取巧来解决,分情况讨论: (1)整数 (2)浮点 ...
- leetcode - valid number 正则表达式解法
import java.util.regex.Pattern; public class Solution { Pattern p = Pattern.compile("^[\\+\\-]? ...
- [LeetCode] Valid Number 确认是否为数值
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- 【LeetCode】65. Valid Number
Difficulty: Hard More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...
- 【leetcode】Valid Number
Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...
随机推荐
- django中views中方法的request参数
知其然亦要知其所以然 views每个方法的参数都是request,那么问题来了,request为何物? 首先,几乎每个方法都是取数据(无论是从数据库,还是从第三方接口),然后进行一定的处理,之后传给前 ...
- IOS 设置视图半透明子控件不透明
代码处理: UIColor *color = [[UIColor blackColor] colorWithAlphaComponent:0.6]; self.view.backgroundColor ...
- 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)
传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...
- tp5 数据库
连接数据库: 在config下面的database.php里. 查找数据: halt(Db::name('studys')->column('name','age')); 也可以用find fi ...
- C++: find()函数的注意事项
头文件: <algorithm> iterator find(iterator it1, iterator it2, &T);
- charming_memory
Memory Master 一 .Forget遗忘 遗忘似乎是记忆的天敌,但是善用遗忘规律却能帮助我们更好的记忆. 复习的最佳时间是实际材料的1~24小时,最晚不超过2天,复习时间太长,就有一种生疏的 ...
- shell实例利用crontab自动清除日志
shell实例利用crontab自动清除日志 程序运行会产生很多的日志,对于无用的日志手动删除比价麻烦,写一个自动执行的命令是很有必要的. 删除文件shell命令 find 对应目录 -mtime + ...
- win32控制台程序 宽字符与短字符转化
由于vs各版本之间存在字符设置不兼容问题,特总结char与tchar的互相转换函数,如下,在之后的工程中可以使用. void TcharToChar(const TCHAR * tchar, char ...
- 二进制安装mysql5.7
1.创建用户和组 groupadd mysql useradd -r -g mysql mysql 2.上传二进制包至/usr/local下解压并改名为mysql tar zxvf mysql-5.7 ...
- [转]Virtio balloon
http://rwmj.wordpress.com/2010/07/17/virtio-balloon/ After someone asked me a question about “balloo ...