Leetcode-每日一题【剑指 Offer 20. 表示数值的字符串】

题目

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

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

  1. 若干空格
  2. 一个 小数 或者 整数
  3. (可选)一个 'e''E' ,后面跟着一个 整数
  4. 若干空格

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

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

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

  1. (可选)一个符号字符('+''-'
  2. 至少一位数字

部分数值列举如下:

  • ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:

  • ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

示例 1:

输入: s = "0"
**输出:**true

示例 2:

输入: s = "e"
**输出:**false

示例 3:

输入: s = "."
**输出:**false

示例 4:

输入: s = " .1 "
**输出:**true

提示:

  • 1 <= s.length <= 20
  • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.'

解题思路

1.题目要求我们判断字符串是否表示**数值,**对于这种题我们需要进行分类讨论来对每一种情况进行判断。

2.首先我们判断一下字符串 s 是否为空,若为空就返回 false。然后因为空格是合法的,但是它会影响我们的判断,所以我们需要去除空格,用trim()函数,再将去除后的元素放入字符数组res中,方便我们进行判断。

3.之后我们用for循环进行遍历,逐一列举可能的情况并进行判断,大家可以结合流程图和代码进行理解。

代码实现

java 复制代码
class Solution {
    public boolean isNumber(String s) {
        if(s == null || s.length() == 0){
            return false;
        }
        char[] res = s.trim().toCharArray();
        if(res.length <= 0){
            return false;
        } 
        int n = res.length;
        boolean is_dot = false;
        boolean is_num = false;
        boolean is_E_or_e = false;
        for(int i = 0; i < n; i++){
            //当前元素为数字时
            if(res[i] >= '0' && res[i] <= '9' ){
                is_num = true;
                //当前元素为.时
            }else if(res[i] == '.'){
                //前面不能有.和e/E
                if(is_dot || is_E_or_e){
                    return false;
            }
            is_dot = true;
            //当前元素为e/E时
        }else if(res[i] =='e' || res[i] == 'E'){
            //前面必须有一个数字,前面不能出现e/E
            if(!is_num || is_E_or_e){
                return false;
            }
            is_E_or_e = true;
            is_num = false; //防止发送11E的这种情况,所以要将is_num重置
            //当前元素为'-''+'时
        }else if(res[i] == '+' || res[i] == '-'){
            if(i != 0 && res[i-1] != 'e' && res[i-1] != 'E'){
                return false;
             }
             //不是以上的五种字符
        }else{
            return false;
        }
        }
        return is_num;
    }
}

测试结果

相关推荐
间彧1 小时前
SimpleDateFormat既然不推荐使用,为什么java 8+中不删除此类
java
间彧1 小时前
DateTimeFormatter相比SimpleDateFormat在性能上有何差异?
java
间彧1 小时前
为什么说SimpleDateFormat是经典的线程不安全类
java
MacroZheng1 小时前
横空出世!MyBatis-Plus 同款 ES ORM 框架,用起来够优雅!
java·后端·elasticsearch
CoovallyAIHub2 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
用户0332126663672 小时前
Java 查找并替换 Excel 中的数据:详细教程
java
间彧2 小时前
ThreadLocal实现原理与应用实践
java
若水不如远方2 小时前
Netty的四种零拷贝机制:深入原理与实战指南
java·netty
用户7493636848432 小时前
【开箱即用】一分钟使用java对接海外大模型gpt等对话模型,实现打字机效果
java