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


    1. 题目

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

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

      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"]

    2. 示例

    示例1:

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

    示例2:

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

    示例3:

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

     示例4:

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

    3. 提示

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

     4. 题解

    本题如果去找false情况就会变的很复杂,最好的是找true的情况。

    可能会出现空格,首先将前空格符去掉。

    遍历每一个数字:

    • 如果是数字,则标记为数字
    • 如果是“.”
      • 判断这是第一次出现,并且没有出现过e
    • 如果是“e”或“E”
      • 判断这是第一次数显,并且出现过数字,
      • 还需要把数字标记为false,否则如果是以e或E结尾的就会变成true,比如说123e
    • 如果是“+”或“-”
      • 判断是否是出现在首位
      • 或者是否前面是e或E
    • 其他情况
      • 全为非法

    5. 实现

     1 class Solution {
     2     public boolean isNumber(String s) {
     3         if(s.length() == 0 || (" ").equals(s)) return false;
     4         boolean numFlag = false; // 标记数字
     5         boolean dotFlog = false; // 标记点
     6         boolean eFlag = false; // 标记e或E
     7         s = s.strip(); // 去掉空格符
     8 
     9         for(int i = 0; i < s.length(); i++) {
    10             char temp = s.charAt(i);
    11             // 判定为数字,numFlag = true
    12             if(temp >= '0' && temp <= '9') {
    13                 numFlag = true;
    14             }
    15             // 判定为".",需要没有出现过,并且没有出现过e
    16             else if(temp == '.' && !dotFlog && !eFlag) {
    17                 dotFlog = true;
    18             }
    19             // 判定为e,需要没出现过E,并且出现过数字
    20             else if((temp == 'e' || temp == 'E') && !eFlag && numFlag) {
    21                 eFlag = true;
    22                 numFlag = false; // 出现e后就标记为false
    23             }
    24             // 判定为+/-符号,只能出现在第一位或者紧接e后面
    25             else if((temp == '+' || temp == '-') && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) {
    26 
    27             }
    28             // 其他情况都是非法的
    29             else {
    30                 return false;
    31             }
    32         }
    33         return numFlag;
    34     }
    35 }

    6. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

     

     

     

     

     

    但行好事 莫问前程
  • 相关阅读:
    05-java学习-循环结构
    04-java学习-选择结构
    03-java学习-基本数据类型-运算符-键盘接收用户输入
    A02-java学习-classpath配置-标识符-java变量类型
    A01-java学习环境准备
    20190215面试-C#操作外设-多线程-shocket
    装饰者模式
    状态模式
    DllImport学习
    网络编程(一)----基础知识、数据流套接字
  • 原文地址:https://www.cnblogs.com/haifwu/p/14977867.html
Copyright © 2020-2023  润新知