表示数值的字符串

本贴最后更新于 2467 天前,其中的信息可能已经时移世异

题目描述

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

解题思路

正则表达式的实现。

用一个 hasNumber 标记是否已经存在有效数字,此时存在以下几种情况:

  • 第一个字符如果是“+/-”,直接跳过,进入下一字符;
  • 本字符是 0,有以下几种情况:
    • 如果 hasNumber 存在有效数字,则进入下一字符;
    • 如果 hasNumber 无有效数字,则下一字符必须是“.”,且“.”后有有效数字,进入子函数 isNumericHasDot
    • 如果下一位不是“.”,返回 false。
  • 如果本字符是“.”,则之后必须存在有效数字;
  • 如果本字符是“e/E”,则有两种情况:
    • 如果本字符是最后一位,返回 false;
    • 如果不是最后一位,进入子函数 isNumericHasE。
  • 其他情况,返回 false。

代码

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0)
            return false;
        boolean hasNumber = false;
        for (int i = 0; i < str.length; i++) {
            if (i == 0 && (str[i] == '+' || str[i] == '-'))
                continue;
            if (!hasNumber && str[i] == 0)
                if (i == str.length-1 || i == str.length - 2) {
                    return false;
                } else if (str[i+1] == '.') {
                    return isNumericHasDot(str, i+2);
                } else {
                    return false;
                }
            if (!hasNumber && str[i] > '0' && str[i] <= '9')
                hasNumber = true;
            if (hasNumber && (str[i] == 'e' || str[i] == 'E'))
                return (i+1 < str.length) && isNumericHasE(str, i+1);
            if (str[i] == '.')
                return (i+1 < str.length) && isNumericHasDot(str, i+1);
            if (str[i] < '0' || str[i] > '9')
                return false;
        }
        return hasNumber;
    }
    
    private boolean isNumericHasDot(char[] str, int index) {
        boolean hasNumber = false;
        for (int i = index; i < str.length; i++) {
            if (!hasNumber && str[i] >= '0' && str[i] <= '9')
                hasNumber = true;
            if (hasNumber && (str[i] == 'e' || str[i] == 'E'))
                return (i+1 < str.length) && isNumericHasE(str, i+1);
            if (str[i] < '0' || str[i] > '9')
                return false;
        }
        return hasNumber;
    }
    
    private boolean isNumericHasE(char[] str, int index) {
        boolean hasNumber = false;
        for (int i = index; i < str.length; i++) {
            if (i == index && (str[i] == '+' || str[i] == '-'))
                continue;
            if (!hasNumber && str[i] > '0' && str[i] <= '9')
                hasNumber = true;
            if (!hasNumber && str[i] == '0')
                return false;
            if (str[i] < '0' || str[i] > '9')
                return false;
        }
        return hasNumber;
    }
}

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...