剑指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
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/

参考答案

class Solution {
    private int i;

    public boolean isNumber(String s) {
        if (s == null) {
            return false;
        }
        char[] str = s.trim().toCharArray();
        i = 0;
        boolean numeric = scanInteger(str);

        // 如果出现'.',则接下来是数字的小数部分
        if (i < str.length && str[i] == '.') {
            i++;
            // 下面一行代码用||的原因:
            // 1. 小数可以没有整数部分,如 .123 等于 0.123;
            // 2. 小数点后面可以没有数字,如 233. 等于 233.0;
            // 3. 当然,小数点前面和后面可以都有数字,如 233.666
            numeric = scanUnsignedInteger(str) || numeric;
        }
        // 如果出现 'e' 或者 'E',则接下来是数字的指数部分
        if (i < str.length && (str[i] == 'e' || str[i] == 'E')) {
            i++;
            // 下面一行代码用&&的原因:
            // 1. 当 e 或 E 前面没有数字时,整个字符串不能表示数字,如 .e1、e1;
            // 2. 当 e 或 E 后面没有整数时,整个字符串不能表示数字,如 12e、12e+5.4
            numeric = numeric && scanInteger(str);
        }
        return numeric && i == str.length;
    }

    private boolean scanUnsignedInteger(char[] str) {
        int before = i;
        while (i < str.length && str[i] >= '0' && str[i] <= '9') {
            i++;
        }
        // 当 str 中存在若干 0~9 的数字时,返回 true
        return i > before;
    }

    private boolean scanInteger(char[] str) {
        if (i == str.length) {
            return false;
        }
        if (str[i] == '+' || str[i] == '-') {
            i++;
        }
        return scanUnsignedInteger(str);
    }
}

复杂度分析

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容