剑指 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. 结语

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

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

 

 

 

 

 

但行好事 莫问前程
原文地址:https://www.cnblogs.com/haifwu/p/14977867.html