[LeetCode] 65. Valid Number
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:
- One or more digits, followed by a dot
'.'
. - One or more digits, followed by a dot
'.'
, followed by one or more digits. - A dot
'.'
, followed by one or more digits.
- One or more digits, followed by a dot
An integer can be split up into these components (in order):
- (Optional) A sign character (either
'+'
or'-'
). - 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 agreetest(5, "00", true); //Cannot agreetest(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 agreetest(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 sotest(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 }