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"));

    }
}
购物商城项目采用PHP+mysql有以及html+css jq以及layer.js datatables bootstorap等插件等开发,采用了MVC模式,建立一个完善的电商系统,通过不同用户的不同需求,进行相应的调配和处理,提高对购买用户进行配置….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值