【剑指 Offer】20. 表示数值的字符串

【题目】

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

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

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

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

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

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

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

部分数值列举如下:

    ["+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),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof

【思路】

先判空,如为空不能表示数值
设置标志位 标记数字,小数点和e
 删除字符串首位的空格,然后将其转换为字符数组
遍历
判断是否为数字,是的话标记数字为true
是否是小数点 小数点前不能为小数点,小数点前也不能为e ,都满足 标记小数点为true
是否是e 如果是,前面必须是数字,且不能为e,满足标记e为true 然后标记数字为false
是否是符号位 如果是,必须是在首位或e位后,否则不满足

【代码】

class Solution {
    public boolean isNumber(String s) {
       //先判空,如为空不能表示数值
       //设置标志位 标记数字,小数点和e
       // 删除字符串首位的空格,然后将其转换为字符数组
       // 遍历
       // 判断是否为数字,是的话标记数字为true
       //     是否是小数点 小数点前不能为小数点,小数点前也不能为e ,都满足 标记小数点为true
       //     是否是e 如果是,前面必须是数字,且不能为e,满足标记e为true 然后标记数字为false
       //     是否是符号位 如果是,必须是在首位或e位后,否则不满足
       
       if(s.length()==0) return false;
       boolean num_flag = false;
       boolean dot_flag = false;
       boolean e_flag = false;
       char[]  num = s.trim().toCharArray();
       for(int i=0;i<num.length;i++){
           if(num[i]>='0'&&num[i]<='9'){
               num_flag = true;
           }else if(num[i]=='.'){
               if(dot_flag!=true&&e_flag!=true){
                   dot_flag = true;
               }else{
                   return false;
               }
           }else if(num[i]=='e'||num[i]=='E'){
               if(!e_flag&&num_flag){
                   e_flag = true;
                   num_flag= false;
               }else{
                   return false;
               }
           }else if(num[i]=='+'|| num[i]=='-'){
               if(i!=0&&num[i-1]!='e'&&num[i-1]!='E'){
                   return false;
               }
           }else{
               return false;
           }
       }
       // 最后一定是数字或小数点 不是的话也是错的 
       return num_flag;
    }
}   

 

posted @ 2023-04-18 09:22  梦想是能睡八小时的猪  阅读(15)  评论(0)    收藏  举报