剑指Offer Java版 面试题20:表示数值的字符串

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

练习地址

https://www.nowcoder.com/practice/6f8c901d091949a5837e24bb82a731f2

参考答案

和书上稍微不同,但更易于理解,且时间复杂度相同。

public class Solution {
    public boolean isNumeric(char[] str) {
        if (str == null || str.length == 0) {
            return false;
        }
        boolean hasDot = false, hasE = false;
        for (int i = 0; i < str.length; i++) {
            if (str[i] == '.') {
                if (hasDot) {
                    // 已经出现过'.'
                    return false;
                } else {
                    hasDot = true;
                }
            } else if (isE(str[i])) {
                if (hasE) {
                    // 已经出现过'E'
                    return false;
                }
                // 'E'后面不会再出现'E'和'.'
                hasE = true;
                hasDot = true;
            } else if (isPlusMinus(str[i])) {
                if (i != 0 && (!hasE || !isE(str[i - 1]))) {
                    // '+''-'不是第一个且前面不是'E'
                    return false;
                }
            } else if (!isNumber(str[i])) {
                return false;
            }
        }
        // 最后一个不是'E'
        return !isE(str[str.length - 1]);
    }
    
    private boolean isE(char c) {
        return c == 'E' || c == 'e';
    }
    
    private boolean isPlusMinus(char c) {
        return c == '+' || c == '-';
    }
    
    private boolean isNumber(char c) {
        return c >= '0' && c <= '9';
    }
}

复杂度分析

  • 时间复杂度:O(n)。
  • 空间复杂度:O(1)。

剑指Offer Java版目录
剑指Offer Java版专题

你可能感兴趣的:(剑指Offer Java版 面试题20:表示数值的字符串)