[LeetCode] 65. Valid Number

A valid number can be split up into these components (in order):

  1. A decimal number or an integer.
  2. (Optional) An 'e' or 'E', followed by an integer.

A decimal number can be split up into these components (in order):

  1. (Optional) A sign character (either '+' or '-').
  2. One of the following formats:
    1. One or more digits, followed by a dot '.'.
    2. One or more digits, followed by a dot '.', followed by one or more digits.
    3. A dot '.', followed by one or more digits.

An integer can be split up into these components (in order):

  1. (Optional) A sign character (either '+' or '-').
  2. One or more digits.

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

Constraints:

  • 1 <= s.length <= 20
  • s consists of only English letters (both uppercase and lowercase), digits (0-9), plus '+', minus '-', or dot '.'.

有效数字。

有效数字(按顺序)可以分成以下几个部分:

一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:

(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:

(可选)一个符号字符('+' 或 '-')
至少一位数字
部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

剑指Offer里有一道一模一样的题。唯一多的case是对数函数底数e是有大小写的。

题目没有给出非常具体的有效数字的定义,但是给了一些例子帮你理解什么叫有效什么叫无效。

思路只能是从例子下手了。注意到这么几点

  • 首先input字符串里面一定需要有数字
  • 之后需要判断是否有e,如果有e,则必须先看到数字才行,否则就是错的
  • 如果碰到小数点,但是是在e之后或者已经出现过小数点了,就是错的
  • 如果遇到加减号,看一下是不是在input的首位或者在不在e之后的那一位上,如果不满足则是错的
  • 最后判断有没有遇到数字

照着这个思路,代码就不难写了。但是有的case,讨论区很多同学都不认同,我也在这里分享出来。

test(1, "123", true);
test(2, " 123 ", true);
test(3, "0", true);
test(4, "0123", true);  //Cannot agree
test(5, "00", true);  //Cannot agree
test(6, "-10", true);
test(7, "-0", true);
test(8, "123.5", true);
test(9, "123.000000", true);
test(10, "-500.777", true);
test(11, "0.0000001", true);
test(12, "0.00000", true);
test(13, "0.", true);  //Cannot be more disagree!!!
test(14, "00.5", true);  //Strongly cannot agree
test(15, "123e1", true);
test(16, "1.23e10", true);
test(17, "0.5e-10", true);
test(18, "1.0e4.5", false);
test(19, "0.5e04", true);
test(20, "12 3", false);
test(21, "1a3", false);
test(22, "", false);
test(23, "     ", false);
test(24, null, false);
test(25, ".1", true); //Ok, if you say so
test(26, ".", false);
test(27, "2e0", true);  //Really?!
test(28, "+.8", true);  
test(29, " 005047e+6", true);  //Damn = =|||

时间O(n)

空间O(1)

Java实现

 1 class Solution {
 2     public boolean isNumber(String s) {
 3         boolean eSeen = false;
 4         boolean numSeen = false;
 5         boolean dotSeen = false;
 6         s = s.trim();
 7         for (int i = 0; i < s.length(); i++) {
 8             char c = s.charAt(i);
 9             if (Character.isDigit(c)) {
10                 numSeen = true;
11             } else if (c == 'e' || c == 'E') {
12                 if (eSeen || !numSeen) {
13                     return false;
14                 }
15                 eSeen = true;
16                 numSeen = false;
17             } else if (c == '.') {
18                 if (eSeen || dotSeen) {
19                     return false;
20                 }
21                 dotSeen = true;
22             } else if (c == '-' || c == '+') {
23                 if (i != 0 && s.charAt(i - 1) != 'e' && s.charAt(i - 1) != 'E') {
24                     return false;
25                 }
26             } else {
27                 return false;
28             }
29         }
30         return numSeen;
31     }
32 }

 

LeetCode 题目总结

posted @ 2020-07-16 12:57  CNoodle  阅读(517)  评论(0)    收藏  举报