zoukankan      html  css  js  c++  java
  • 0065. Valid Number (H)

    Valid Number (H)

    题目

    Validate if a given string can be interpreted as a decimal number.

    Some examples:
    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true
    " -90e3 " => true
    " 1e" => false
    "e3" => false
    " 6e-1" => true
    " 99e2.5 " => false
    "53.5e93" => true
    " --6 " => false
    "-+3" => false
    "95a54e53" => false

    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one. However, here is a list of characters that can be in a valid decimal number:

    • Numbers 0-9
    • Exponent - "e"
    • Positive/negative sign - "+"/"-"
    • Decimal point - "."

    Of course, the context of these characters also matters in the input.

    Update (2015-02-10):
    The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.


    题意

    给定一个字符串,判断它能不能正确表示一个数。满足条件的字符串中只可能包含以下字符:'0'-'9'、科学计数'e'、正负符号'+'/'-'、小数点'.'。

    思路

    坑点在于需要判断的情况比较多。我的方法是针对字符串中的每一个字符,只判断它与前后两个字符形成的组合是否有效。具体有效组合参考注释。(d代表数字)


    代码实现

    Java

    class Solution {
        public boolean isNumber(String s) {
            boolean isExponentExist = false;	// 记录'e'是否已出现
            boolean isPointExist = false;		// 记录'.'是否已出现
    
            s = s.trim();
            
            if (s.length() == 0) {
                return false;
            }
    
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (!isDigit(c) && c != '+' && c != '-' && c != 'e' && c != '.') {
                    return false;
                }
                if ((c == '+' || c == '-') && !isPlusOrMinusValid(s, i)) {
                    return false;
                }
                if (c == 'e') {
                    if (isExponentExist || !isExponentValid(s, i)) {
                        return false;
                    }
                    isExponentExist = true;
                }
                if (c == '.') {
                    if (isPointExist || isExponentExist || !isPointValid(s, i)) {
                        return false;
                    }
                    isPointExist = true;
                }
            }
            return true;
        }
    
        private boolean isDigit(char c) {
            return c >= '0' && c <= '9';
        }
    	
        // '+'/'-'的有效组合:   [+-][d.]  e[+-]d
        private boolean isPlusOrMinusValid(String s, int i) {
            if (i == 0 && 1 < s.length() && (isDigit(s.charAt(1)) || s.charAt(1) == '.')) {
                return true;
            }
            if (i - 1 >= 0 && s.charAt(i - 1) == 'e' && i + 1 < s.length() && isDigit(s.charAt(i + 1))) {
                return true;
            }
            return false;
        }
    
        // 'E'的有效组合:   [d.]e[d+-] 
        private boolean isExponentValid(String s, int i) {
            if (i - 1 >= 0) {
                char left = s.charAt(i - 1);
                if (i + 1 < s.length()) {
                    char right = s.charAt(i + 1);
                    if ((isDigit(left) || left == '.') && (isDigit(right) || right == '+' || right == '-')) {
                        return true;
                    }
                }
            }
            return false;
        }
    
        // '.'的有效组合:   d.d  d.e  [+-].d  d.  .d     
        private boolean isPointValid(String s, int i) {
            if (i - 1 >= 0) {
                char left = s.charAt(i - 1);
                if (i + 1 < s.length()) {
                    char right = s.charAt(i + 1);
                    if (isDigit(left) && (right == 'e' || isDigit(right))) {
                        return true;
                    }
                    if ((left == '+' || left == '-') && isDigit(right)) {
                        return true;
                    }
                } else {
                    if (isDigit(left)) {
                        return true;
                    }
                }
            } else {
                if (i + 1 < s.length()) {
                    char right = s.charAt(i + 1);
                    if (isDigit(right)) {
                        return true;
                    }
                }
            }
            return false;
        }
    }
    

    JavaScript

    /**
     * @param {string} s
     * @return {boolean}
     */
    var isNumber = function(s) {
        return !s.match(/.?Infinity/) && !Number.isNaN(Number(s))
    };
    
  • 相关阅读:
    Androidの多线程之多线程用法大集合(未整理)
    Androidの多线程之更新ui(Thread+Handler+Message)
    构建之法阅读笔记1
    文件与流
    公文流转系统一
    JAVA web课堂测试1
    10.21动手动脑
    Android学习02
    Android学习01
    Android学习03
  • 原文地址:https://www.cnblogs.com/mapoos/p/14771668.html
Copyright © 2011-2022 走看看