美文网首页
表示数值的字符串

表示数值的字符串

作者: 囧略囧 | 来源:发表于2020-02-25 14:39 被阅读0次

    题目描述

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    解法一:

    通过观察我们发现,字符串为数值需满足以下几个条件:
    1、可以包含E或e,也可以不包含E或e
    2、若包含E或e,则只能出现一次,且不在字符串末尾
    3、E或e前面的部分可以是整数也可以是小数,之后的部分只能是整数。
    由此我们只需要判断字符串是否包含E或e,且前半部分是否是整数或小数,后半部分是否是小数即可。

    public class Solution {
        public boolean isNumeric(char[] str) {
            int i = 0;
            for(i = 0; i < str.length; i++) {
                if(str[i] == 'E' || str[i] == 'e') {
                    break;
                }
            }
            //E(或e)的位置不能为字符串末尾
            if(i == str.length - 1) {
                return false;
            }
            //字符串不含E或e
            else if(i == str.length) {
                return isNumber(str, 0, str.length - 1);
            }
            //字符串含E或e,且不在字符串末尾
            else {
                if(isNumber(str, 0, i - 1) && isNumber(str, i + 1, str.length - 1)) {
                    if(isInt(str, i + 1, str.length - 1)) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
                else {
                    return false;
                }
            }
        }
        
        //判断是否是合法数字(整数或小数)
        public boolean isNumber(char[] str, int start, int end) {
            int pointCount = 0;
            for(int i = start; i <= end; i++) { if(str[i] >= '0' && str[i] <= '9') {
                    continue;
                }
                if(str[i] == '.') {
                    if(pointCount == 0) {
                        pointCount++;
                        continue;
                    }
                    else {
                        return false;
                    }
                }
                else {
                    //处理+-号问题
                    boolean isSymbol = (i == start) && (str[i] == '+' || str[i] == '-');
                    if(isSymbol) {
                        continue;
                    }
                    else {
                        return false;
                    }
                }
            }
            return true;
        }
        //在已知为合法数字的基础上判断是否是整数
        public boolean isInt(char[] str, int start, int end) {
            for(int i = start; i <= end; i++) { 
                if(str[i] == '.') {
                    return false;
                }
            }
            return true;
        }
    }
    
    解法二:

    表示字符的字符串遵循模式:
    A[.[B]][e|EC],如100、1.2、1.2e、1.2E+4
    或.B[e|EC],如.2、.3e-2
    其中A和C表示整数(可以有符号)、B表示无符号整数。
    于是对于一个字符串,我们可以先判断其开头是否为A部分,判断之后是否为小数点,若有小数点之后是否为B部分,之后是否为e|E,若为e|E之后是否为C部分。

    public class Solution {
        public boolean isNumeric(char[] str) {
            int index = scanInteger(str, 0);
            if((index < str.length) && (str[index] == '.')) {
                index = scanUnsignedInteger(str, index + 1);
            }
            boolean isE = (index < str.length - 1) && (str[index] == 'E' || str[index] == 'e');
            if(isE) {
                index = scanInteger(str, index + 1);
            }
            if(index == str.length) {
                return true;
            }
            else {
                return false;
            }
        }
        /**判断是否为A或C部分*/
        public int scanInteger(char[] str, int start) {
            int end = start;
            boolean isSymbol = (end < str.length) && (str[end] == '+' || str[end] == '-');
            if(isSymbol) {
                 end++;
            }
            return scanUnsignedInteger(str, end);
        }
        /**判断是否为B部分*/
        public int scanUnsignedInteger(char[] str, int start) {
            int end = start;
            while((end < str.length) && (str[end] >= '0' && str[end] <= '9')) {
                end++;
            }
            return end;
        }
    }
    

    相关文章

      网友评论

          本文标题:表示数值的字符串

          本文链接:https://www.haomeiwen.com/subject/qtcvqctx.html