LeetCode Summary
  • Introduction
  • DP, 动态规划类
    • Best Time to Buy and Sell Stock III 题解
    • Best Time to Buy and Sell Stock 题解
    • Climbing Stairs 题解
    • Decode Ways 题解
    • Distinct Subsequences 题解
    • Edit Distance 题解
    • Interleaving String 题解
    • Longest Palindromic Substring 题解
    • Maximum Product Subarray 题解
    • Maximum Subarray 题解
    • Minimum Path Sum 题解
    • Palindrome Partitioning 题解
    • Palindrome Partitioning II 题解
    • Scramble String 题解
    • Triangle 题解
    • Unique Binary Search Trees 题解
    • Unique Paths II 题解
    • Word Break 题解
    • Word Break II 题解
  • list, 链表相关
    • Add Two Numbers 题解
    • Convert Sorted List to Binary Search Tree 题解
    • Copy List with Random Pointer 题解
    • Insertion Sort List 题解
    • LRU Cache 题解
    • Linked List Cycle 题解
    • Linked List Cycle II 题解
    • Merge Two Sorted Lists 题解
    • Merge k Sorted Lists 题解
    • Partition List 题解
    • Remove Duplicates from Sorted List 题解
    • Remove Duplicates from Sorted List II 题解
    • Remove Nth Node From End of List 题解
    • Reorder List 题解
    • Reverse Linked List II 题解
    • Reverse Nodes in k-Group 题解
    • Rotate List 题解
    • Sort List 题解
    • Swap Nodes in Pairs 题解
  • binary tree, 二叉树相关
    • Balanced Binary Tree 题解
    • Binary Tree Inorder Traversal 题解
    • Binary Tree Level Order Traversal 题解
    • Binary Tree Level Order Traversal II 题解
    • Binary Tree Maximum Path Sum 题解
    • Binary Tree Postorder Traversal 题解
    • Binary Tree Preorder Traversal 题解
    • Binary Tree Zigzag Level Order Traversal 题解
    • Construct Binary Tree from Inorder and Postorder Traversal 题解
    • Construct Binary Tree from Preorder and Inorder Traversal 题解
    • Convert Sorted List to Binary Search Tree 题解
    • Flatten Binary Tree to Linked List 题解
    • Maximum Depth of Binary Tree 题解
    • Minimum Depth of Binary Tree 题解
    • Path Sum 题解
    • Path Sum II 题解
    • Populating Next Right Pointers in Each Node 题解
    • Populating Next Right Pointers in Each Node II 题解
    • Recover Binary Search Tree 题解
    • Same Tree 题解
    • Sum Root to Leaf Numbers 题解
    • Symmetric Tree 题解
    • Unique Binary Search Trees 题解
    • Unique Binary Search Trees II 题解
    • Validate Binary Search Tree 题解
  • sort, 排序相关
    • 3Sum Closest 题解
    • 3Sum 题解
    • 4Sum 题解
    • Insert Interval 题解
    • Longest Consecutive Sequence 题解
    • Merge Intervals 题解
    • Merge Sorted Array 题解
    • Remove Duplicates from Sorted Array 题解
    • Remove Duplicates from Sorted Array II 题解
    • Sort Colors 题解
    • Two Sum 题解
  • search, 搜索相关
    • First Missing Positive 题解
    • Find Minimum in Rotated Sorted Array 题解
    • Find Minimum in Rotated Sorted Array II 题解
    • Median of Two Sorted Arrays 题解
    • Search Insert Position 题解
    • Search a 2D Matrix 题解
    • Search for a Range 题解
    • Search in Rotated Sorted Array 题解
    • Search in Rotated Sorted Array II 题解
    • Single Number 题解
    • Single Number II 题解
  • math, 数学类相关
    • Add Binary 题解
    • Add Two Numbers 题解
    • Divide Two Integers 题解
    • Gray Code 题解
    • Integer to Roman 题解
    • Multiply Strings 题解
    • Palindrome Number 题解
    • Plus One 题解
    • [Pow(x, n) 题解](math/Pow(x,-n).md)
    • Reverse Integer 题解
    • Roman to Integer 题解
    • [Sqrt(x) 题解](math/Sqrt(x).md)
    • [String to Integer (atoi) 题解](math/String-to-Integer-(atoi).md)
    • Valid Number 题解
  • string, 字符串处理相关
    • Anagrams 题解
    • Count and Say 题解
    • Evaluate Reverse Polish Notation 题解
    • [Implement strStr() 题解](string/Implement-strStr().md)
    • Length of Last Word 题解
    • Longest Common Prefix 题解
    • Longest Palindromic Substring 题解
    • Longest Substring Without Repeating Characters 题解
    • Longest Valid Parentheses 题解
    • Minimum Window Substring 题解
    • Regular Expression Matching 题解
    • Reverse Words in a String 题解
    • Simplify Path 题解
    • Text Justification 题解
    • Valid Parentheses 题解
    • Wildcard Matching 题解
    • ZigZag Conversion 题解
  • combination and permutation, 排列组合相关
    • Combinations 题解
    • Combination Sum 题解
    • Combination Sum II 题解
    • Letter Combinations of a Phone Number 题解
    • Next Permutation 题解
    • Palindrome Partitioning 题解
    • Permutation Sequence 题解
    • Permutations 题解
    • Permutations II 题解
    • Subsets 题解
    • Subsets II 题解
    • Unique Paths 题解
  • matrix, 二维数组, 矩阵相关
    • Rotate Image 题解
    • Set Matrix Zeroes 题解
    • Spiral Matrix 题解
    • Spiral Matrix II 题解
    • Maximal Rectangle 题解
  • 回溯, BFS/DFS
    • Clone Graph 题解
    • Generate Parentheses 题解
    • N-Queens 题解
    • N-Queens II 题解
    • Restore IP Addresses 题解
    • Sudoku Solver 题解
    • Surrounded Regions 题解
    • Word Ladder 题解
    • Word Ladder II 题解
    • Word Search 题解
  • greedy, 贪心
    • Best Time to Buy and Sell Stock II 题解
    • Jump Game 题解
    • Jump Game II 题解
  • 其他
    • Candy 题解
    • Container With Most Water 题解
    • Gas Station 题解
    • Gray Code 题解
    • Max Points on a Line 题解
    • [Pascal's Triangle 题解](others/Pascal's-Triangle.md)
    • [Pascal's Triangle II 题解](others/Pascal's-Triangle-II.md)
    • Remove Element 题解
    • Trapping Rain Water 题解
Powered by GitBook
On this page
  • 粗暴方法
  • 利用strtod.
  • 利用自动机

Was this helpful?

  1. math, 数学类相关

Valid Number 题解

Previous[String to Integer (atoi) 题解](math/String-to-Integer-(atoi).md)Nextstring, 字符串处理相关

Last updated 5 years ago

Was this helpful?

题目来源:

> 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.

解题思路:

粗暴方法

自己写的代码丑陋无比,一种情况一种情况试, 实在是无参考价值。 主要是各种情况,例如:

input

result

.123

true

12.

True

47e+6

True

__1.__

True

.

False

46.e3

OJ里的 .2e81 true 0.e false 46.e3 true

+3

True

-.3

True

6e6.5

false

    bool isNumber(const char *s)
    {
        if(s == NULL) return false;
        if(*s == '\0') return false;
        while(*s == ' ')
            s++; //skip 空格
        if(*s == '\0') return false;
        if(*s == '-' || *s == '+') s++;
        bool firstnumber = false;
        if((*s >= '0' && *s <= '9') || *s == '.')
            firstnumber = true;
        if(! firstnumber) return false;
        bool has_e_before = false;
        bool has_dot_before = *s == '.';
        if(has_dot_before)
        {
            s++;
            if (!(*s >= '0' && *s <= '9')) return false; // "."
        }
        while(*s != '\0')
        {
            if(*s >= '0' && *s <= '9')
            {
                s++;
            }else if(*s == 'e')
            {
                if(has_e_before) return false;//.2e81  true  //0.e false  //46.e3 true
                has_e_before = true;
                s++;
                if(*s == '+' || *s == '-') s++; //005047e+6 ok
                if (!(*s >= '0' && *s <= '9')) return false; //"e." "e 1"
            }else if(*s == ' ')
            {
                while(*s != '\0' && *s == ' ')
                    s++;
                if(*s == '\0')//"  1.2  "
                    return true;
                return false; //" 2.3  3" 
            }else if(*s == '.') 
            { 
                if(has_dot_before || has_e_before) return false; 
                has_dot_before = true; 
                s++; 
            }else 
            { 
                return false; 
            } 
        } 
        return true; 
    }

整理下上面的代码,可以更好看些。

    bool isNumber(const char *s) 
    {
        if(s == NULL ) return false;
        bool isNum = false; bool isDot = false; bool isExp = false;
        const char* end = s;
        while(*end != '\0') end++;
        --end;
        while(*end == ' ') --end;
        while(*s == ' ') s++;

        if(*s == '+')s++;
        else if(*s == '-')s++;
        while(s <= end)
        {
            if(*s>= '0' && *s <= '9'){
                isNum = true;
            }else if(*s == '.'){
                if (isDot || isExp) return false;
                isDot = true;
            }else if(*s == 'e'){
                if(isExp||!isNum) return false;
                isExp = true;
                isNum = false;//e 后面必须得有数字
            }else if(*s == '+'||*s == '-'){
                if(*(s-1) != 'e') return false;
            }else 
                return false;
            s++;
        }
        return isNum;
    }

利用strtod.

利用函数strtod.

double      strtod( const char          *str, char          **str_end );
    bool isNumber(const char *s) 
    {
        char * end;
        strtod(s, &end);
        if(end == s) return false; // "  "
        while(*end != '\0')
        {
            if(*end != ' ')
                return false;
            end++;
        }
        return true;
    }

利用自动机

注释一下本题分多少状态吧:
0初始无输入或者只有space的状态
1输入了数字之后的状态
2前面无数字,只输入了Dot的状态
3输入了符号状态
4前面有数字和有dot的状态
5'e' or 'E'输入后的状态
6输入e之后输入Sign的状态
7输入e后输入数字的状态
8前面有有效数输入之后,输入space的状态
共9种状态了,难设计的是6,7,8状态。
分好之后就好办了,设计出根据输入进行状态转换就OK了。
    class Solution {
    public:
         bool isNumber(const char *s) {
              enum InputType {
                   INVALID,          // 0 Include: Alphas, '(', '&' ans so on
                   SPACE,          // 1
                   SIGN,          // 2 '+','-'
                   DIGIT,          // 3 numbers
                   DOT,               // 4 '.'
                   EXPONENT,          // 5 'e' 'E'
              };
              int transTable[][6] = {
              //0INVA,1SPA,2SIG,3DI,4DO,5E
                   -1,  0,  3,  1,  2, -1,//0初始无输入或者只有space的状态
                   -1,  8, -1,  1,  4,  5,//1输入了数字之后的状态
                   -1, -1, -1,  4, -1, -1,//2前面无数字,只输入了Dot的状态
                   -1, -1, -1,  1,  2, -1,//3输入了符号状态
                   -1,  8, -1,  4, -1,  5,//4前面有数字和有dot的状态
                   -1, -1,  6,  7, -1, -1,//5'e' or 'E'输入后的状态
                   -1, -1, -1,  7, -1, -1,//6输入e之后输入Sign的状态
                   -1,  8, -1,  7, -1, -1,//7输入e后输入数字的状态
                   -1,  8, -1, -1, -1, -1,//8前面有有效数输入之后,输入space的状态
              };
              int state = 0;
              while (*s)
              {
                   InputType input = INVALID;
                   if (*s == ' ') input = SPACE;
                   else if (*s == '+' || *s == '-') input = SIGN;
                   else if (isdigit(*s)) input = DIGIT;
                   else if (*s == '.') input = DOT;
                   else if (*s == 'e' || *s == 'E') input = EXPONENT;
                   state = transTable[state][input];
                   if (state == -1) return false;
                   ++s;
              }
              return state == 1 || state == 4 || state == 7 || state == 8;
         }
    };

能够一步一步提取str中能够组成的double, str_end为提取后剩下的串。这里找了一份实现, 有兴趣的可以参考下 .

可参考 .

Valid Number
strtod的源码
自动机实现valid-number