剑指Offer_53_表示数值的字符串

题目描述

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

解题思路

首先判断是否有符号(+或者-),如果有,则对后面的字符串判断
首先需要扫描数字直到结束或是遇到其他字符,结束则返回true,否则继续按情况判断下一个需要判断的字符

  • 如果是小数点'.',是则扫描数字,直到结束(返回true)或者遇到特殊字符,如果是e或E,那么对后面的数判断是否符合指数表示,如果是其他字符则返回false。
  • 如果是e或者E,那么对后面的数判断是否符合指数表示。
  • 如果不符合上面的情况则返回false

指数判断:
首先判断是否是符号,如果是,跳到下一位判断后面的是否是数字组成的串,是则表示指数表示是正确的,否则是不正确的。

实现

public class Solution {
    /**
     * 根据题目要求,正确的输入格式应该符合以下的形式:
     * [sign]integer-digits[.[fragment-digits]][e|E[sign]exponential-digits]
     * []中的表示不一定需要
     * @param str
     * @return
     */
    public boolean isNumeric(char[] str) {
        if (str == null || str.length <= 0) return false;
        int index = 0;
        //判断是否有符号
        if(str[index] == '+' || str[index] == '-'){
            index++;
        }
        //如果只有符号位,则不是正确的数字
        if (index == str.length) return false;
        //扫描数字
        index = scanDigits(str,index);
        if (index < str.length){
            //如果有小数
            if (str[index] == '.'){
                index++;
                index = scanDigits(str,index);
                //如果有指数表示的形式
                if (index < str.length){
                    if (str[index] == 'e' || str[index] == 'E'){
                        index++;
                        return isExponential(str,index);
                    }
                    return false;
                }
                return true;
            }else if (str[index] == 'e' || str[index] == 'E'){
                //如果没有小数,且有指数形式
                index++;
                return isExponential(str,index);
            }
            return false;
        }
        return true;
    }

    private boolean isExponential(char[] str, int index) {
        if (index < str.length){
            //如果是符号,跳到下一个
            if (str[index] == '+' || str[index] == '-'){
                index++;
            }
            index = scanDigits(str,index);
            if (index == str.length) return true;
            return false;
        }
        return false;
    }

    private int scanDigits(char[] str, int index) {
        while (index < str.length && str[index] >= '0' && str[index] <= '9') index++;
        return index;
    }
}
posted @   峰扬迪  阅读(1370)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示