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;
    }
}

测试结果

相关推荐
爱读源码的大都督15 分钟前
为什么有了HTTP,还需要gPRC?
java·后端·架构
Lucky_Turtle34 分钟前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
聪明的笨猪猪1 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.1 小时前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
ID_180079054731 小时前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
StarPrayers.2 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
微露清风2 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥2 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计
爱吃橘的橘猫2 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式
235162 小时前
【LeetCode】146. LRU 缓存
java·后端·算法·leetcode·链表·缓存·职场和发展