《剑指offer》-表示数值的字符串

南楼画角 提交于 2019-11-29 09:46:00

表示数值的字符串

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

表示数字的字符串遵循模式 [+ | - ] [ A ] [ . [ B ]] [ e | E C]

  1. 符号不是必须的,但是如果有的话,必须是 +或者-,而且后面必须跟数字
  2. 整数部分不是必须的,比如 .123 代表 0.123
  3. 小数部分不是必须的,但是如果有小数部分,就一定有小数点。比如 123. 代表 123.0 123e2
  4. 指数部分也不是必须的,但是如果有的话,后面必须接数字 比如 123e 就是不合法的

根据这个逻辑,我们一共进行了4个判断,分别判断:符号、数字、小数点、e和E

使用 int cur 和 boolean isNum , isNum 代表 在 cur 之前的数字是否合法。

public class Solution {
    public int cur = 0;
    public boolean isNumeric(char[] str) {
        if(str == null || str.length == 0){
            return false;
        }
        boolean isNum = signed(str);
        if(cur < str.length && str[cur] == '.'){
            cur++;
            // 这里为什么用或。
            // 第一个判断的是,从游标开始是否有数字
            // 第二个判断的是,在小数点之前的,是否符合规则
            // 由于小数点前、后面都可以没有数字,比如 .123 和 123.
            isNum = unsignedInteger(str) || isNum;
        }
        if(cur < str.length &&(str[cur] == 'e' || str[cur] == 'E')){
            cur++;
            // 这里为什么用 与
            // 第一个判断是,在e 和 E之前,是否符合规则
            // 第二个判断是,e、E 后面是否有数字
            // 由于在e和E前后都必须有数字,所以这里用 &&
            isNum = isNum && signed(str);
        }
        return (isNum && cur == str.length);
    }
    public boolean unsignedInteger(char[] str){
        int beforeCur = cur;
        // 判断从游标开始有没有数字。
        while(cur < str.length && str[cur] >= '0' && str[cur] <= '9'){
            cur++;
        }
        // 有数字的话 返回true 没有数字的话 返回false
        return (cur > beforeCur);
    }
    // 如果是正负号,则跳过,并且判断后面的是否是数字
    public boolean signed(char[] str){
        if(cur < str.length && (str[cur] == '+' || str[cur] == '-')){
            cur++;
        }
        return unsignedInteger(str);
    }
}

功能测试:正数或者负数、包含或者不包含整数部分的数值、包含或者不包含小数部分的数值、包含或者不包含指数部分的数值、各种不能表达有效数值的字符换
特殊输入测试:输入字符串是null、空指针

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!