# 65_Valid_Number ###### tags: `leetcode` ## Problem Statement A valid number can be split up into these components (in order): A decimal number or an integer. (Optional) An 'e' or 'E', followed by an integer. A decimal number can be split up into these components (in order): (Optional) A sign character (either '+' or '-'). One of the following formats: At least one digit, followed by a dot '.'. At least one digit, followed by a dot '.', followed by at least one digit. A dot '.', followed by at least one digit. An integer can be split up into these components (in order): (Optional) A sign character (either '+' or '-'). At least one digit. For example, all the following are valid numbers: ["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"], while the following are not valid numbers: ["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]. Given a string s, return true if s is a valid number. - Example 1: > Input: s = "0" Output: true - Example 2: > Input: s = "e" Output: false - Example 3: > Input: s = "." Output: false - Example 4: > Input: s = ".1" Output: true - Constraints: > 1 <= s.length <= 20 s consists of only English letters (both uppercase and lowercase), digits (0-9), plus '+', minus '-', or dot '.'. ## Solution - Give out each character in the string the constraints that they need to follow. - Each element can be seperated into 2 main parts. - ```e``` or ```E``` have already appeared. - Not yet. - If appeared, Only ```integer``` is allowed to be a valid one, else can be a float. - The 1^st^ case: ```+/-``` - ```cnt``` is 1 or 4 depends on ```e```. - If it is the last one, not the first and the last one is not ```e```, only '.': false. ```cpp= if (s[i]== '+'|| s[i]== '-') { if (i== s.length()- 1|| (i!= 0&& cnt!= 3)|| s.length()== 1) return 0; if (cnt== 3) cnt= 4; else cnt= 1; } ``` - The 2^nd^ case: ```0~9``` - ```cnt``` is 2 or 5 depends on ```e```. ```cpp= else if (s[i]- '0'> -1&& s[i]- '0'< 10) { if (cnt> 2) cnt= 5; else cnt= 2; } ``` - The 3^rd^ case: ```e/E``` - ```cnt``` is 3. - If the last one is not a number, it is the last one or the first: false. ```cpp= else if (s[i]== 'e'|| s[i]== 'E') { if (cnt!= 2|| i== s.length()- 1|| i== 0) return 0; cnt= 3; } ``` - The last case: ```.``` - If there has already one dot, only ```.```, ```e/ E``` has appeared, It is the last one and hte last one is not a number: false. ```cpp= else if (s[i]== '.') { if (dot|| s.length()== 1|| cnt> 2|| (i== s.length()- 1&& cnt% 3!= 2)) return 0; dot= 1; } ```