3298 字
约 10 分钟
10
065.有效数字
无标签

065.有效数字

作者:沉默王二
发布时间:2022-12-01T14:50:02.476+0800


本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

有效数字(按顺序)可以分成以下几个部分:

  • 一个 小数 或者 整数
  • (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 下述格式之一:
  • 至少一位数字,后面跟着一个点 '.'
  • 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
  • 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

难度

困难

示例

示例 1:

输入:s = "0"

示例 2:

输入:s = "e"

示例 2:

输入:s = "."

分析

看着这么多的限制条件,是不是一下子就被冲昏了头?

别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。

判断有效数字,我们先从最基础的开始——判断是否是整数。

要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:

  • 至少有一位数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样子我们就可以写出如下的代码:

boolean isInteger(String str){

 for(int i = 0;i < str.length();i++){  if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){         continue;        }        if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){         haveNum = true;        }        else         return false; } return haveNum;}

下一步就是判断小数了,我们照样可以提炼出几个要素:

  • 要有小数点.
  • 小数点前后至少得有一边有数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。

boolean isNum(String str,boolean mustInt){

    for(int i = 0;i < str.length();i++){        if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){            continue;        }        if(str.charAt(i) == '.'){            if(haveDot || mustInt)                return false;            haveDot = true;        }        else            if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                haveNum = true;            }        else            return false;    }    return haveNum;}

这时候就只剩下了这个E的问题了,不慌,我们继续分析。

如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。

如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。

这样子我们就把整个模拟的过程给理顺了:

class Solution {

        int size = s.length();        int ePos = -1;        for(int i = 0;i < size;i++){            boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e';            if(b && ePos == -1){                ePos = i;                continue;            }            else if(b){                return false;            }        }        if(ePos == -1 || ePos == 0){            return isNum(s,false);        }        else{            return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true);        }    }    private boolean isNum(String str,boolean mustInt){        boolean haveDot = false,haveNum = false;        for(int i = 0;i < str.length();i++){            if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){                continue;            }            if(str.charAt(i) == '.'){                if(haveDot || mustInt)                    return false;                haveDot = true;            }            else                if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                    haveNum = true;                }                else                    return false;        }        return haveNum;    }}

总结

其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。

力扣链接:https://leetcode.cn/problems/valid-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

有效数字(按顺序)可以分成以下几个部分:

  • 一个 小数 或者 整数
  • (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 下述格式之一:
  • 至少一位数字,后面跟着一个点 '.'
  • 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
  • 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

难度

困难

示例

示例 1:

输入:s = "0"

示例 2:

输入:s = "e"

示例 2:

输入:s = "."

分析

看着这么多的限制条件,是不是一下子就被冲昏了头?

别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。

判断有效数字,我们先从最基础的开始——判断是否是整数。

要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:

  • 至少有一位数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样子我们就可以写出如下的代码:

boolean isInteger(String str){

 for(int i = 0;i < str.length();i++){  if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){         continue;        }        if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){         haveNum = true;        }        else         return false; } return haveNum;}

下一步就是判断小数了,我们照样可以提炼出几个要素:

  • 要有小数点.
  • 小数点前后至少得有一边有数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。

boolean isNum(String str,boolean mustInt){

    for(int i = 0;i < str.length();i++){        if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){            continue;        }        if(str.charAt(i) == '.'){            if(haveDot || mustInt)                return false;            haveDot = true;        }        else            if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                haveNum = true;            }        else            return false;    }    return haveNum;}

这时候就只剩下了这个E的问题了,不慌,我们继续分析。

如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。

如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。

这样子我们就把整个模拟的过程给理顺了:

class Solution {

        int size = s.length();        int ePos = -1;        for(int i = 0;i < size;i++){            boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e';            if(b && ePos == -1){                ePos = i;                continue;            }            else if(b){                return false;            }        }        if(ePos == -1 || ePos == 0){            return isNum(s,false);        }        else{            return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true);        }    }    private boolean isNum(String str,boolean mustInt){        boolean haveDot = false,haveNum = false;        for(int i = 0;i < str.length();i++){            if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){                continue;            }            if(str.charAt(i) == '.'){                if(haveDot || mustInt)                    return false;                haveDot = true;            }            else                if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                    haveNum = true;                }                else                    return false;        }        return haveNum;    }}

总结

其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。

力扣链接:https://leetcode.cn/problems/valid-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

本题解同时收录在星球专栏《二哥的 LeetCode 刷题笔记》中,专栏托管在语雀平台上(更方便你沉浸式阅读和做笔记,数学表达公式也能显示出来),访问地址和密码:https://t.zsxq.com/6iuzn6I

题意

有效数字(按顺序)可以分成以下几个部分:

  • 一个 小数 或者 整数
  • (可选)一个 'e' 或 'E' ,后面跟着一个 整数

小数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 下述格式之一:
  • 至少一位数字,后面跟着一个点 '.'
  • 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
  • 一个点 '.' ,后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  • (可选)一个符号字符('+' 或 '-')
  • 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

难度

困难

示例

示例 1:

输入:s = "0"

示例 2:

输入:s = "e"

示例 2:

输入:s = "."

分析

看着这么多的限制条件,是不是一下子就被冲昏了头?

别担心,这类题目的难点就在于此,用一堆的限制条件让你晕头转向。但只要我们肯一点点抽丝剥茧,这道题难不倒我们,最不济,也可以用模拟这种非常朴素的算法来解决。

判断有效数字,我们先从最基础的开始——判断是否是整数。

要判断一个字符串是不是整数,按照题目的要求和我们的经验,可以提炼出这几个要素:

  • 至少有一位数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样子我们就可以写出如下的代码:

boolean isInteger(String str){

 for(int i = 0;i < str.length();i++){  if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){         continue;        }        if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){         haveNum = true;        }        else         return false; } return haveNum;}

下一步就是判断小数了,我们照样可以提炼出几个要素:

  • 要有小数点.
  • 小数点前后至少得有一边有数字
  • 可以有一个符号('+' 或 '-')
  • 不存在任何数字以外的其他字符

这样一看,小数和整数的差别就在于小数点而已,所以我们不妨在刚刚的方法上加以改造,便可以得出一个用来判断是否为数字的方法了。

boolean isNum(String str,boolean mustInt){

    for(int i = 0;i < str.length();i++){        if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){            continue;        }        if(str.charAt(i) == '.'){            if(haveDot || mustInt)                return false;            haveDot = true;        }        else            if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                haveNum = true;            }        else            return false;    }    return haveNum;}

这时候就只剩下了这个E的问题了,不慌,我们继续分析。

如果没有E的话,那么我们只需要判断整个字符串是否为整数或者小数即可。

如果有的话,我们则根据E的位置将整个字符串分成两块,一块是E前面的,这部分可以是整数也可以是小数,也可以没有,另外一块则是E后面的,这部分的话,必须是整数。

这样子我们就把整个模拟的过程给理顺了:

class Solution {

        int size = s.length();        int ePos = -1;        for(int i = 0;i < size;i++){            boolean b = s.charAt(i) == 'E' || s.charAt(i) == 'e';            if(b && ePos == -1){                ePos = i;                continue;            }            else if(b){                return false;            }        }        if(ePos == -1 || ePos == 0){            return isNum(s,false);        }        else{            return isNum(s.substring(0,ePos),false) && isNum(s.substring(ePos + 1),true);        }    }    private boolean isNum(String str,boolean mustInt){        boolean haveDot = false,haveNum = false;        for(int i = 0;i < str.length();i++){            if(i == 0 && (str.charAt(i) == '+' || str.charAt(i) == '-')){                continue;            }            if(str.charAt(i) == '.'){                if(haveDot || mustInt)                    return false;                haveDot = true;            }            else                if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){                    haveNum = true;                }                else                    return false;        }        return haveNum;    }}

总结

其实再庞大的代码,都是由一个个的细节构成的,万丈高楼起于毫厘,日常的积累也是如此。

力扣链接:https://leetcode.cn/problems/valid-number/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 1000 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
065.有效数字
https://clxhxhhr.top/posts/2519/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。
☰ 文章目录