【LeetCode笔记】剑指 Offer 20. 表示数值的字符串(Java、字符串)

题目描述

  • 呃…比较恶心的一道题,需要读好题,分完情况再下手
  • 有看到dalao用有限状态机来做,不过这边还是直接用了我自己的做法= =
    在这里插入图片描述

思路 && 代码

  • ps:这里没有参考题解的写法,用的是方便自己理解的写法,所以可能代码有冗余,不过复杂度是没问题的~
  • s 分为三部分:part1 = 小数 || 整数,part2 = e/E,part3 = 整数;part23可选
  • 新增两个函数:isInteger() 整数判断,以及 isDecimal() 小数判断
  • 先来一个循环,找到第一个 e / E 的位置,作为 part 的分界点
  • 然后对 part1 进行 小数 or 整数判断,对 part3 进行整数判断即可
  • 注意:无论小数、整数,都需要有数字元素
class Solution {
    public boolean isNumber(String s) {
        // init
        s = s.trim();
        if(s.length() == 0) {
            return false;
        }
        char[] sArr = s.toCharArray();

        // 数值 = 小数 or 整数 + (可选) e or E + 整数
        int eIndex = s.length();
        for(int i = 0; i < s.length(); i++) {
            if(sArr[i] == 'e' || sArr[i] == 'E') {
                eIndex = i;
            }
        }

        // 第一部分为整数 or 小数
        boolean part1 = (isInteger(sArr, 0, eIndex - 1) || isDecimal(sArr, 0, eIndex - 1));
        // 可选:第二部分为整数
        if(eIndex != s.length()) {
            // 后不跟整数的情况
            if(eIndex == s.length() - 1) {
                return false;
            }
            part1 = part1 && isInteger(sArr, eIndex + 1, s.length() - 1);
        }

        return part1;
    }

    public boolean isInteger(char[] arr, int start, int end) {
        int numsCount = 0;

        // 符号位处理
        int index = start;
        if(arr[index] == '-' || arr[index] == '+') {
            index++;
        }

        // 元素处理
        for(; index <= end; index++) {
            if(arr[index] < '0' || arr[index] > '9') {
                return false;
            }
            numsCount++;
        }
        // 存在数字才算整数
        return numsCount > 0;
    }

    public boolean isDecimal(char[] arr, int start, int end) {
        int index = start;
        if(arr[index] == '-' || arr[index] == '+') {
            index++;
        }

        int pointNums = 0, numCount = 0;
        for(; index <= end; index++) {
            if(arr[index] == '.') {
                pointNums++;
                continue;
            }
            else if(arr[index] < '0' || arr[index] > '9') {
                return false;
            }
            numCount++;
        }
        // 只有一个小数点,并且存在数字的情况才是小数
        return pointNums == 1 && numCount != 0;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值