[剑指 Offer 第 2 版第 20 题] “表示数值的字符串”做题记录
[剑指 Offer 第 2 版第 20 题] “表示数值的字符串”做题记录
第 20 题:表示数值的字符串
传送门: 表示数值的字符串,牛客网 online judge 地址。
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串
"+100"
,"5e2"
,"-123"
,"3.1416"
和"-1E-16"
都表示数值。但是
"12e"
,"1a3.14"
,"1.2.3"
,"+-5"
和"12e+4.3"
都不是。注意:
- 小数可以没有整数部分,例如.123等于0.123;
- 小数点后面可以没有数字,例如233.等于233.0;
- 小数点前面和后面可以有数字,例如233.666;
- 当e或E前面没有数字时,整个字符串不能表示数字,例如.e1、e1;
- 当e或E后面没有整数时,整个字符串不能表示数字,例如12e、12e+5.4;
样例:
输入: "0"
输出: true
Python 代码:
class Solution(object):
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
size = len(s)
# 1、去掉多余的空格
i = 0
while i < size and s[i] == ' ':
i += 1
j = size - 1
while j >= 0 and s[j] == ' ':
j -= 1
if i > j:
return False
s = s[i:j - i + 1]
# 2、首字母可以是加号或者减号
if s[0] == '+' or s[0] == '-':
s = s[1:]
if len(s) == 0:
return False
# 3、只有 1 个点,不行
if len(s) == 1 and s[0] == '.':
return False
# 4、下面对点的个数和 e 的个数展开讨论
# 点的个数
dot_cnt = 0
# e 的个数
e_cnt = 0
size = len(s)
i = -1
while i < size - 1:
i += 1
if '0' <= s[i] <= '9':
continue
elif s[i] == '.':
dot_cnt += 1
# 如果没有 e,并且点的数量大于 1,不符合要求
if e_cnt or dot_cnt > 1:
return False
elif s[i] == 'e' or s[i] == 'E':
e_cnt += 1
if i == 0 or i == size - 1 or e_cnt > 1:
return False
# '.' 后面不能加上
if i == 1 and s[0] == '.':
return False
if s[i + 1] == '+' or s[i + 1] == '-':
if i + 2 == size:
return False
i += 1
else:
return False
return True
if __name__ == '__main__':
solution = Solution()
s = '123.45e+6'
result = solution.isNumber(s)
print(result)
“大雪菜”的解法:https://www.acwing.com/solution/acwing/content/737/。
C++ 代码:
C++ 代码:
class Solution {
public:
bool isNumber(string s) {
int i = 0;
while (i < s.size() && s[i] == ' ') i ++ ;
int j = s.size() - 1;
while (j >= 0 && s[j] == ' ') j -- ;
if (i > j) return false;
s = s.substr(i, j - i + 1);
if (s[0] == '-' || s[0] == '+') s = s.substr(1);
if (s.empty() || s[0] == '.' && s.size() == 1) return false;
int dot = 0, e = 0;
for (int i = 0; i < s.size(); i ++ )
{
if (s[i] >= '0' && s[i] <= '9');
else if (s[i] == '.')
{
dot ++ ;
if (e || dot > 1) return false;
}
else if (s[i] == 'e' || s[i] == 'E')
{
e ++ ;
if (i + 1 == s.size() || !i || e > 1 || i == 1 && s[0] == '.') return false;
if (s[i + 1] == '+' || s[i + 1] == '-')
{
if (i + 2 == s.size()) return false;
i ++ ;
}
}
else return false;
}
return true;
}
};
作者:yxc 链接:https://www.acwing.com/solution/acwing/content/737/ 来源:AcWing 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:liweiwei1419
来源:https://liweiwei1419.github.io/sword-for-offer/
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com