LeetCode65. 有效数字

这题完美的诠释了什么叫“面向测试用例编程”。由于要考虑的情况很多,所以基本的思路是先根据给出的测试用例写出规则判断无效的情况,然后再根据提交的错误对剩下的情况进行特判,如果不满足所有“无效的情况”,则有效。题目特别提了“我们有意将问题陈述地比较模糊”,这个“有意地陈述地模糊”就很灵性,所以一开始很难考虑到所有情况,WA几次就知道有哪些测试用例(规则)了。
先从题目给出的测试用例里总结几点规则:
- 给出的字符串可能会包含前缀和后缀的空格,需要先去掉前缀和后缀的空格;
- 有可能字符串是一个科学计数法的数字,因此会出现字符'e'或'E',但'e'(或'E')只能出现一次,且不能出现在字符串的开头和结尾位置;
- 'e'(或'E')的后面可能紧跟一个'+'或'-',正负号只能出现在两个地方,一是字符串开头,二就是'e'(或'E')的后面,其他位置如果出现正负号,就可以判定为无效! 另外,'e'(或'E')后面如果出现了正负号,后面还必须有数字,所以要判断正负号是不是字符串的结尾,如果是,也可以判定为无效;
- 字符串开头可以是正负号,但如果只有正负号,则无效;
再从提交的测试用例里总结几点规则: - 字符串可以由'.'开头,比如".1"就表示0.1,这种'.'后面是数字的就是合法的,'.'后面跟着其他字符就是非法的;
- '.'和'e'只能分别出现一次,多于一次就是无效的
class Solution {
public:
bool isNumber(string s) {
int left = 0, right = s.size() - 1; //分别从左右过滤掉前缀和后缀的空格
while(left <= right && s[left] == ' ') {
++left;
}
while(left <= right && s[right] == ' ') {
--right;
}
if(left > right) { //如果字符串只有空格组成,则无效
return false;
}
s = s.substr(left, right - left + 1); //留下删除掉前缀和后缀的空格之后的字符串
if(s[0] == '+' || s[0] == '-') { //如果字符串由正负号开头,则删掉开头的字符串再作判断
s = s.substr(1); //substr只传入一个参数1,表示留下从第一个位置到末尾的子串(即删除第0个位置的正负号)
}
if(s.empty()) { //如果删掉正负号之后字符串为空,则无效
return false;
}
if(s[0] == '.' && (s.size() == 1 || s[1] == 'e' || s[1] == 'E')) { //如果字符串有'.'开头,则有三种情况是无效的:(1)字符串只有一个字符'.'; (2)下一个字符是'e'; (3)下一个字符是'E'。 实际上,只要'.'后面的字符不是数字就都是无效的,只不过其他情况在别处判断了。
return false;
}
int dotNum = 0, eNum = 0; //记录'.'和'e'(或'E')的数量
for(int i = 0; i < s.size(); ++i) {
if(s[i] == '.') {
if(dotNum > 0 || eNum > 0) { //如果'.'出现次数大于1或者'.'在'e'(或'E')之后出现,则无效
return false;
} else {
++dotNum;
}
} else if(s[i] == 'e' || s[i] == 'E') {
if(i == 0 || i == s.size() - 1 || eNum > 0) { //如果'e'(或'E')出现在开头或者结尾位置,或者出现次数大于1,则无效
return false;
} else if(s[i + 1] == '+' || s[i + 1] == '-') { //如果'e'(或'E')后面的字符是正负号,需要特判
if(i + 1 == s.size() - 1) { //正负号后面需要有数字,如果正负号已经是最后一个字符了(后面啥都没),则无效
return false;
} else {
++i; //如果正负号后面还有东西,我们就跳过正负号,继续判断后面的
}
}
++eNum;
} else if(!(s[i] >= '0' && s[i] <= '9')) { //其他情况的字符只能是数字,其他都是无效的
return false;
}
}
return true; //如果不满足上述任何情况,我们就认为字符串可以表示为一个有效的数字!
}
};
复杂度分析:由于只遍历一遍字符串,时间复杂度是O(n);只开了常数个变量,空间复杂度是O(1)。
LeetCode65. 有效数字的更多相关文章
- [Swift]LeetCode65. 有效数字 | Valid Number
Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...
- float 的有效数字为七位是怎么得出来的
以下内容来自CSDN网友xian_wwq的回答(http://bbs.csdn.net/topics/390874239): float: 1bit(符号位) 8bits(指数位) 23bits( ...
- java保留有效数字
DecimalFormat df=DecimalFormat("######0.0") double d = df.format(xx): 保留一位就是"######0. ...
- 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)
本文转载自:阮一峰的博客,http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 张玉彬的博客 h ...
- valid number 判断字符串是否为有效数字
RT,面试题,给定一个字符串判断是否为科学计数法的有效数字.此题各种繁琐考虑.今天终于学会了用有限状态机来处理.理解之后简洁易懂.在此分享我的理解推导思路,大有收获啊. 网上有解法说先记录每个状态代表 ...
- SQL去掉小数点有效数字后的所有0
原文:SQL去掉小数点有效数字后的所有0 第一种方法 select cast(2.5000000000000 as real) select cast(2 as real) select ...
- iOS 科学计数法保留N位有效数字
iOS开发 项目中用到了将一个很大的数值转换成科学计数法的需求,转换成科学计数法的方式在iOS中其实是很好做的,使用NSNumber 的 kCFNumberFormatterScientificSty ...
- Java使用BigDecimal保留double、float运算精度、保留指定位数有效数字、四舍五入
工具类 package --; import java.math.BigDecimal; /** * Created by kongqw on 2015/12/10. */ public final ...
- C#版 - Leetcode 65. 有效数字 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...
随机推荐
- Java实现蓝桥杯日期问题
历届试题 日期问题 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月3 ...
- Java实现 LeetCode 477 汉明距离总和
477. 汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进 ...
- Java实现 LeetCode 127 单词接龙
127. 单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度.转换需遵循如下规则: 每次转换只能改变一个字 ...
- 终于我用JOL打破了你对java对象的所有想象
目录 简介 JOL简介 使用JOL分析VM信息 使用JOL分析String 使用JOL分析数组 使用JOL分析自动装箱 使用JOL分析引用关系 总结 简介 使用面向对象的编程语言的好处就是,虽然没有女 ...
- iOS-线程&&进程的深入理解
进程基本概念 进程就是一个正在运行的一个应用程序; 每一个进度都是独立的,每一个进程均在专门且手保护的内存空间内; iOS是怎么管理自己的内存的,见博客:博客地址 在Linux系统中,想要新开启一个进 ...
- Action的三种实现方式,struts.xml配置的详细解释及其简单执行过程(二)
勿以恶小而为之,勿以善小而不为--------------------------刘备 劝诸君,多行善事积福报,莫作恶 上一章简单介绍了Struts2的'两个蝴蝶飞,你好' (一),如果没有看过,请观 ...
- @Autowired 注解详解
前言 我们平时使用 Spring 时,想要 依赖注入 时使用最多的是 @Autowired 注解了,本文主要讲解 Spring 是如何处理该注解并实现 依赖注入 的功能的. 正文 首先我们看一个测试用 ...
- javascript 面向对象学习(三)——this,bind、apply 和 call
this 是 js 里绕不开的话题,也是非常容易混淆的概念,今天试着把它理一理. this 在非严格模式下,总是指向一个对象,在严格模式下可以是任意值,本文仅考虑非严格模式.记住它总是指向一个对象对于 ...
- 织梦cms 内容模型 option下拉框 value 分离
需要修改的文件在根目录include/customfields.func.php文件 foreach($items as $v) { $v = trim($v); if($v!='') { $myfo ...
- css布局中的垂直水平居中对齐
前言 我们都知道,固定高宽的div在网页中垂直居中很简单,相信大家也很容易的写出来,但是不是固定高宽的div如何垂直居中呢?我们在网页布局,特别是手机等web端网页经常是不固定高宽的div,那么这些d ...