• [Leetcode 27] 65 Valid Number


    Problem:

    Validate if a given string is numeric.

    Some examples:
    "0" => true
    " 0.1 " => true
    "abc" => false
    "1 a" => false
    "2e10" => true

    Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.

    Analysis:

    So many cases to consider!

    First of all, remove all the space at both ends of the given string;

    Now we start from the left. 

    The first position is a little bit special

    1. '+/-': skip them

    2. '.': set the dotFlag

    3. '0~9': set the numFlag

    4. others:  invalid input 

    we continue 

    if '.' is met, we break out of the current loop, start a new one. Note after '.', only 'e', numbers are allowed.

    if 'e' is met, break out of the current loop, start a new one. Note after 'e', only numbers or '+/-' are allowed

    Code:

     1 class Solution {
     2 public:
     3     bool isNumber(const char *s) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         int idx = 0, len = strlen(s)-1;
     7         bool dotFlag = false, numFlag = false, eFlag=false;
     8         
     9         if (s=="") return false;
    10         
    11         while (s[idx] == ' ') idx++;
    12         if (idx > len) return false;
    13         
    14         while (s[len] == ' ') len--;
    15         
    16         
    17         if (s[idx] == '+' || s[idx] == '-') idx++;
    18         
    19         if (idx > len) return false;
    20         
    21         int i;
    22         for (i=idx; i<=len; i++) {
    23             if (s[i] == 'e') {
    24                 i += 1;
    25                 eFlag = true;
    26                 break;
    27             }
    28             
    29             if (s[i] == '.') {
    30                 i += 1;
    31                 dotFlag = true;
    32                 break;
    33             }
    34             
    35             if (s[i]>='0' && s[i]<='9') {
    36                numFlag = true;
    37             } else {
    38                 return false;
    39             }
    40             
    41         }
    42         
    43         
    44         if (dotFlag) {
    45             if (!numFlag && (i>len || ((s[i]<'0' && s[i]>'9') && s[i]!='e')))
    46                 return false;
    47             
    48             for (; i<=len; ++i) {
    49                 if (s[i] <'0' || s[i] > '9') {
    50                     if (s[i] == 'e') {
    51                         i+= 1;
    52                         eFlag = true;
    53                         break;
    54                     } else {
    55                         return false;
    56                     }
    57                 }
    58                 
    59                 numFlag = true;
    60             }
    61         }
    62         
    63         //number after e
    64         if (eFlag) {
    65             if (!numFlag) return false;
    66             
    67             if (i==idx+1 || i>len) return false;
    68         
    69             if (s[i] == '+' || s[i] == '-')
    70                 i += 1;
    71             
    72             if (i > len) return false;
    73             
    74             for (; i<=len; i++) {
    75                 if (s[i]<'0' || s[i]>'9')
    76                     return false;
    77             }
    78         }
    79         
    80         
    81         return true;
    82     }
    83 };
    View Code

    Attention:

  • 相关阅读:
    影视感悟
    缩写字母
    从工程文化和运维理念理解Netflix
    telinit:Did not receive a reply.Possible causes include:the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired
    centos6 ext4修复
    windows显示日期时间(精确到秒)
    【C#】IDispose接口的应用
    【转】【WPF】WPF 自定义快捷键命令(Command)
    【转】【WPF】MVVM模式的3种command
    【转】【WPF】WriteableBitmap应用及图片数据格式转换
  • 原文地址:https://www.cnblogs.com/freeneng/p/3086776.html
Copyright © 2020-2023  润新知