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 ...
随机推荐
- excel支持正则表达式提取字符函数(支持RegExp捕获分组)
一.要让excel脚本支持Microsoft VBScript Regular Expressions 5.5 ,按快捷键alt+F11,出现下图界面,操作如图示: 二.添加VBA代码: 代码添加完毕 ...
- rn下的弹性布局
重点: 1]react native 下的弹性布局名字叫:flexDirection 2]flexDirection的默认值是column而不是row,而flex也只能指定一个数字值. 3]使用fle ...
- Django路由分配及渲染
一.url路由分配 1.url配置的本质是将浏览器传递过来的路径和参数与服务器中的视图向匹配,并返回浏览器相应的视图函数. 2.url路径path规则 path(route, view, kwargs ...
- MySQL/Oracle索引的创建与使用
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引. 单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引 ...
- Win10专业版激活
转载来自:http://www.zhuangjiba.com/bios/3432.html 如何激活win10正式版图文解说 打开开始菜单,找到设置,点开“更新和安全”,切换到“激活”选项卡,查看到当 ...
- vim配置文件.vimrc
20171127备份 syntax on "自动语法高亮 set number "显示行号 set autoindent "回车后自动缩进 set tabstop=4 & ...
- mysql中加入海量数据
delimiter // create procedure m() begin declare num int; set num=1; while num < 100000 insert int ...
- Eclipse下用NDK编译生成so文件
我们在安装环境的时候安装了NDK,可以在eclipse下直接生成so文件.NDK的压缩包里面自带了一些sample工程,NDK的文件直接解压到某个目录下即可. 第一次生成so文件的时候,我们先使用 ...
- Js实现继承的方法
原型的作用:1.将公共部分放入原型中,这样构造出的多个实例对象的公共部分只会占用一个公共空间,实现数据共享和节省内存空间 2.通过原型实现继承:构造函数模拟 "类"这个面向对象的概 ...
- Android学习笔记(2):build.grandle的常用设置
1 > java开发中有两个大名鼎鼎的项目构建ANT.Maven. 2 > Google推荐使用的Android Studio是采用Gradle来构建项目的.Gradle是一个非常先进的项 ...