/**
*
* 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. qt字符数组转ASCII(十六进制)

    接收网络传输数据 QByteArray  array;//显示字符串 QString str = QString::fromLocal8Bit(array); m_receiveTxt.append( ...

  2. Linux下安装numpy

    转自:https://blog.csdn.net/abc_321a/article/details/82056019 1.下载源码包 ,命令如下 wget http://jaist.dl.source ...

  3. webveiw返回死循环问题以及在打开web页面会唤起浏览器打开的问题解决

    微信.QQ空间等大量软件都内嵌了H5,不得不说这是一种趋势,Andriod与H5互调可以让我们实现混合开发.至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发 ...

  4. python3--迭代

    判断一个对象是否能够进行迭代的方法 Iterable from collections import Iterable dict = {'name':'Joe','age':17} print (is ...

  5. 【Spring】入门HelloWorld

    参考:https://www.yiibai.com/spring/spring-tutorial-for-beginners.html 一.创建项目 1.利用IntelliJ创建Maven项目 2.配 ...

  6. 利用Python+163邮箱授权码发送邮件

    背景 前段时间写了个自动打卡的脚本,但是脚本不够完善,我需要知道,打卡到底成没成功,因此,我想到了用Python执行完代码之后,再执行一段发送邮件的代码.需求开始明确了,就开始分析和写代码实现吧. 分 ...

  7. 本学期Windows编程微型技术博客上线!

    将两篇报告生成超链接模式方便阅读,以下为链接: https://files.cnblogs.com/files/Kitty-/Windows编程微型技术报告一.pdf https://files.cn ...

  8. memset函数用法

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...

  9. 01 of lenrning python

    我也打算开始写博客啦!记录一下自己的学习过程~ 01密文登陆 这个在vscode中不显示密文 在cmd中看不到密码 # -*- coding: utf-8 -*- import getpass nam ...

  10. Icehouse 创建Instance代码分析

    1. nova-api接收到request 在/etc/nova/api-paste.ini中,是这样配置nova v2的 [app:osapi_compute_app_v2] paste.app_f ...