zoukankan      html  css  js  c++  java
  • 剑指 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. 结语

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

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

     

     

     

     

     

    但行好事 莫问前程
  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/haifwu/p/14977867.html
Copyright © 2011-2022 走看看