/**
*
* 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的更多相关文章

  1. LeetCode: Valid Number 解题报告

    Valid NumberValidate if a given string is numeric. Some examples:"0" => true" 0.1 ...

  2. [LeetCode] Valid Number 验证数字

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  3. [leetcode]Valid Number @ Python

    原题地址:http://oj.leetcode.com/problems/valid-number/ 题意:判断输入的字符串是否是合法的数. 解题思路:这题只能用确定有穷状态自动机(DFA)来写会比较 ...

  4. LeetCode——Valid Number

    Validate if a given string is numeric. Some examples: "0" => true " 0.1 " =&g ...

  5. Leetcode Valid Number

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  6. LeetCode Valid Number 有效数字(有限自动机)

    题意:判断一个字符串是否是一个合法的数字,包括正负浮点数和整形. 思路:有限自动机可以做,画个图再写程序就可以解决啦,只是实现起来代码的长短而已. 下面取巧来解决,分情况讨论: (1)整数 (2)浮点 ...

  7. leetcode - valid number 正则表达式解法

    import java.util.regex.Pattern; public class Solution { Pattern p = Pattern.compile("^[\\+\\-]? ...

  8. [LeetCode] Valid Number 确认是否为数值

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  9. 【LeetCode】65. Valid Number

    Difficulty: Hard  More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...

  10. 【leetcode】Valid Number

    Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 ...

随机推荐

  1. 区域检测算法-MSERs

    区域检测算法-MSERs:最大稳定极值区域 参考书籍——<图像局部不变性特征与描述>王永明.王贵锦著 MSER最大极值稳定区域的提取步骤:1.像素点排序   2.极值区域生成   3.稳定 ...

  2. P4178 Tree

    最简单的点分治 淀粉质的思想: “分而治之”,缩小问题规模,合并求解: #include<cstdio> #include<cmath> #include<cstring ...

  3. centos6安装oracle时运行./runInstaller无法弹出图形界面

    首先确保安装oracle的机器上安装了图形化界面. 1.利用xmanager登录到安装oracle的服务器上(直接用root用户登录) 2.运行 export DISPLAY=你的本机地址:0.0 3 ...

  4. h5上传视频文件

    从一开始我就掉坑里了,<input type="file" style="display: block;" id="img-upload&quo ...

  5. BAT:通过连接符处理判断OR的关系

    使用情况说明: 适用于对某个文件夹下不同的文件夹(名称)做不同的处理,但存在需要对其中多个文件夹(名称)进行相同处理的情况 例子中的目录结构: .\1.2.3 -- 文件夹.\a.b.c -- 文件夹 ...

  6. 万里长征第一步:Python进程池的一点点小坑

    # -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...

  7. css实现圆形倒计时效果

    实现思想: 1.最外层包裹内部的div1(.box) 2.内部左右两边div2(.left_box和.right_box),宽度为div1的一半,通过overflow:hidden隐藏其内部的div ...

  8. Bootstrap3.3.7

    页面的布局 <-!不让文字超出左右屏幕--> <style> .demo { word-wrap: break-word; } </style> 他们为那个模板中的 ...

  9. python paramiko ssh登录交换机执行命令

    # encoding=utf-8 import paramiko import time client = paramiko.SSHClient() client.load_system_host_k ...

  10. unity API 之EventSystem.current.IsPointerOverGameObject()

    命名空间 :UnityEngine.EventSystems 官方描述: public bool IsPointerOverGameObject(); public bool IsPointerOve ...