【Valid Number】cpp
题目:
Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
Note: It is intended for the problem statement to be ambiguous. You should gather all requirements up front before implementing one.
代码:
class Solution {
public:
bool isNumber(string s) {
if ( s.size()< ) return false;
// escape space from begining and end
int index_begin = ;
int index_end = s.size()-;
while ( s[index_begin]==' ' && index_begin<s.size() ) ++index_begin;
while ( s[index_end]==' ' && index_end>= ) --index_end;
// digit, dot, sign, exp
enum PreChar{ NONPRE, DIGIT, SIGN, EXP, DOT };
enum PreChar preChar = NONPRE;
bool hasDigit = false, hasSign = false, hasExp = false, hasDot = false;
int index = index_begin;
for ( ;index <= index_end; ++index )
{
// space
if ( s[index]==' ') return false;
// digit
if ( s[index]>='' && s[index]<='' ) { hasDigit = true; preChar = DIGIT; continue; }
// sign
if ( s[index]=='+' || s[index]=='-' ){
if ( preChar==EXP || preChar==NONPRE ) { preChar = SIGN; hasSign = true; continue; }
else { return false; }
}
// exp
if ( s[index]=='e' || s[index]=='E' ){
if ( (preChar==DIGIT || preChar==DOT) && !hasExp && hasDigit ) { preChar = EXP; hasExp = true; continue; }
else { return false; }
}
// dot
if ( s[index]=='.' ){
if ( !hasExp && !hasDot && (preChar==DIGIT || preChar==SIGN || preChar==NONPRE ) ) { preChar = DOT; hasDot = true; continue; }
else { return false; }
}
// illegal input char
return false;
}
// end with digit or dot
return preChar==DIGIT || (preChar==DOT && hasDigit);
}
};
tips:
主要基于这篇blog的思路(http://blog.unieagle.net/2012/11/06/leetcode题目:valid-number/)。在其基础上,对逻辑进行了更系统的梳理和简化。
思路如下:
1. 首先排除字符串首尾的space,这样可以简化判断逻辑(只要在后面的字符串中再出现空格,就一定不是合法数字)
2. 判断剩余的字符串中出现dot('.'), sign('+','-'), exp('e','E'), digit(0~9)是否是合法的。判断的核心逻辑有两个:
a. 上一个出现的字符是什么(即代码中的preChar)
b. dot,sign,exp,digit,是否在之前出现过
这种代码逻辑的好处是:只要认准了两个核心判断逻辑,在这两个核心逻辑之内修修补补,就可以不断地刷test case直到AC。
如果以后有类似的问题,状态条件非常多的,但是输入条件相对固定;并且又需要根据序列化输入条件判断的。
可以多设定几类变量逻辑变量,然后通过判断几类逻辑变量的取值来往下进行;即使不能一次bug free,但是总可以把逻辑补完全。
=====================================================
之前一直看网上的有限状态机(FSM)的做法(http://www.cnblogs.com/chasuner/p/validNumber.html),这种思路的代码非常consice。
FSM怎么运转的,解释的很清晰;但是FSM中这0~8的状态是怎么来的,我并没有看懂,所以只好选择比较一般的方法。
================================================
第二次过这道题,直接照着上次写的代码记忆重复了一下。
class Solution {
public:
bool isNumber(string s) {
if ( s.size()< ) return false;
// remove blanks both begin and end
int i_begin = ;
int i_end = s.size()-;
while ( s[i_begin]==' ' && i_begin<i_end ) ++i_begin;
while ( s[i_end]==' ' && i_begin<i_end ) --i_end;
enum PreType{ NONE, DIGIT, EXP, SIGN, DOT };
enum PreType preType = NONE;
bool hasDigit=false, hasExp=false, hasSign=false, hasDot=false;
int i = i_begin;
for ( ;i<=i_end; ++i )
{
// blank
if ( s[i]==' ' )
{
return false;
}
// digit
else if ( s[i]>='' && s[i]<='' )
{
hasDigit = true; preType = DIGIT;
}
// sign
else if ( s[i]=='+' || s[i]=='-' )
{
if ( preType==EXP || preType==NONE )
{
hasSign=true; preType = SIGN;
}
else
{
return false;
}
}
// exp
else if ( s[i]=='e' || s[i]=='E' )
{
if ( (preType==DIGIT || preType==DOT) && !hasExp && hasDigit )
{
hasExp=true; preType=EXP;
}
else
{
return false;
}
}
// dot
else if ( s[i]=='.' )
{
if( !hasExp && !hasDot && (preType==DIGIT || preType==SIGN || preType==NONE ) )
{
hasDot=true; preType = DOT;
}
else
{
return false;
}
}
else
{
return false;
}
}
return preType==DIGIT || (preType==DOT && hasDigit);
}
};
【Valid Number】cpp的更多相关文章
- 【Valid Sudoku】cpp
题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...
- 【Valid Palindrome】cpp
题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...
- 【Valid Parentheses】cpp
题目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the ...
- 【Palindrome Number】cpp
题目: Determine whether an integer is a palindrome. Do this without extra space. click to show spoiler ...
- 【Single Number】cpp
题目: Given an array of integers, every element appears twice except for one. Find that single one. No ...
- 【Longest Valid Parentheses】cpp
题目: Given a string containing just the characters '(' and ')', find the length of the longest valid ...
- 【Letter Combinations of a Phone Number】cpp
题目: Given a digit string, return all possible letter combinations that the number could represent. A ...
- 【Gray Code】cpp
题目: The gray code is a binary numeral system where two successive values differ in only one bit. Giv ...
- 【Sort Colors】cpp
题目: Given an array with n objects colored red, white or blue, sort them so that objects of the same ...
随机推荐
- backBarButtonItem 颜色/文字修改
iOS7之后. 默认的返回按钮字体颜色是蓝色的, 显示内如是父VC(上一级界面)的title 如果要做修改, 可以通过下面的办法: 1. 修改字体颜色 (1) 在plist里面, 加上View con ...
- Android异常一、异步任务导致的窗口句柄泄漏问题(转)
05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window com.android ...
- jQuery中$(function() {});问题详解
$(function() {});是$(document).ready(function(){ })的简写,最早接触的时候也说$(document).ready(function(){ })这个函数是 ...
- CentOS 6.4安装lnmp环境
1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport ...
- jQuery实现跨域访问
示例: $.ajax({ url: url, crossDomain: true, async: false,dataType:"jsonp" }); 说明:$.ajax()有很多 ...
- MongoDb 2.4 beta新特性——全文索引
期待已久的特性,但目前仍然在beta阶段,所以官方建议不要在生产环境使用.也因此需要手动打开这个特性. 在命令行指定 mongod --setParameter textSearchEnabled=t ...
- PHP字符串拼接与MySQL语句
这个部分总是钻牛角尖.总是出错. public function getList($pagesize=25){ $where = '1'; $tableName = $this->getTabl ...
- 如何验证 jemalloc 优化 Nginx 是否生效
Jemalloc 源于 Jason Evans 2006年在 BSDcan conference 发表的论文:<A Scalable Concurrent malloc Implementati ...
- 【easyui】—easyui教你编写一个前台的架子
以前做项目都是在别人搭建好的环境下直接编写单独的页面,也没有处理过怎么搭建一个框架.看到别人的布局都挺好的,自己也想做一个走一下流程. 嘿,刚开始时看着别人写的代码,去找怎么写. 这是我自己的想法,使 ...
- Windows 8.1激活问题
今天电脑开机,莫名的出现“你的Windows证书即将过期”. 系统本来用HEU_KMS_Activator 已激活成功,但查看系统激活状态时,结果如下图所示: 显示系统是已激活成功的.但还是有提示说系 ...