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 ...
 
随机推荐
- qt字符数组转ASCII(十六进制)
			
接收网络传输数据 QByteArray array;//显示字符串 QString str = QString::fromLocal8Bit(array); m_receiveTxt.append( ...
 - Linux下安装numpy
			
转自:https://blog.csdn.net/abc_321a/article/details/82056019 1.下载源码包 ,命令如下 wget http://jaist.dl.source ...
 - webveiw返回死循环问题以及在打开web页面会唤起浏览器打开的问题解决
			
微信.QQ空间等大量软件都内嵌了H5,不得不说这是一种趋势,Andriod与H5互调可以让我们实现混合开发.至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发 ...
 - python3--迭代
			
判断一个对象是否能够进行迭代的方法 Iterable from collections import Iterable dict = {'name':'Joe','age':17} print (is ...
 - 【Spring】入门HelloWorld
			
参考:https://www.yiibai.com/spring/spring-tutorial-for-beginners.html 一.创建项目 1.利用IntelliJ创建Maven项目 2.配 ...
 - 利用Python+163邮箱授权码发送邮件
			
背景 前段时间写了个自动打卡的脚本,但是脚本不够完善,我需要知道,打卡到底成没成功,因此,我想到了用Python执行完代码之后,再执行一段发送邮件的代码.需求开始明确了,就开始分析和写代码实现吧. 分 ...
 - 本学期Windows编程微型技术博客上线!
			
将两篇报告生成超链接模式方便阅读,以下为链接: https://files.cnblogs.com/files/Kitty-/Windows编程微型技术报告一.pdf https://files.cn ...
 - memset函数用法
			
1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...
 - 01 of lenrning python
			
我也打算开始写博客啦!记录一下自己的学习过程~ 01密文登陆 这个在vscode中不显示密文 在cmd中看不到密码 # -*- coding: utf-8 -*- import getpass nam ...
 - Icehouse 创建Instance代码分析
			
1. nova-api接收到request 在/etc/nova/api-paste.ini中,是这样配置nova v2的 [app:osapi_compute_app_v2] paste.app_f ...