LeetCode | 65. Valid Number
来源:互联网 发布:常用 windows api 编辑:程序博客网 时间:2024/05/29 11:44
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.
Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.
个人感觉题目思路很清晰,但是难点在于有很多一开始没想到的测试数据,而题目没有给出明确的“Valid Number”的定义,所以只能不断提交来根据错误的数据更新代码(提交了20次才AC,sad)
class Solution {public: bool isNumber(string s) { int len = s.length(); //去除两边的空格,提取中间的部分,并初步判断合法性 string NewStr = ""; int it = 0; while(s[it] == ' ') it++; while(it<len && s[it]!=' ') NewStr += s[it++]; //后面剩余部分是否全是空格 while(it < len) { if(s[it] != ' ') return false; it++; } len = NewStr.length(); if(len == 0) //字符串为空 return false; if(NewStr[0]=='-' || NewStr[0]=='+') //去除首位正负号的影响 { NewStr = NewStr.substr(1,len-1); len--; } int DotFlag = 0, EFlag = 0; for(int i=0;i<len;i++) { if(NewStr[i] == '.') DotFlag++; if(NewStr[i]=='e' || NewStr[i]=='E') EFlag++; } //e或者 . 的位置、数量有问题 _________测试数据里 ".3" "3." 全认为是正确的 if(NewStr[0]=='e' || NewStr[len-1]=='e' || DotFlag>1 || EFlag>1) return false; //全是数字 if(DotFlag==0 && EFlag==0) { for(int i=0;i<len;i++) if(!(NewStr[i]>='0' && NewStr[i]<='9')) return false; return true; } //只有一个小数点 if(DotFlag==1 && EFlag==0) { if(len == 1) //只有一个小数点,没有数字 return false; for(int i=0;i<len;i++) { if(NewStr[i] == '.') { DotFlag = i; break; } } //小数点前后是否全是数字 for(int i=0;i<DotFlag;i++) if(!(NewStr[i]>='0' && NewStr[i]<='9')) return false; for(int i=DotFlag+1;i<len;i++) if(!(NewStr[i]>='0' && NewStr[i]<='9')) return false; return true; } else { for(int i=0;i<len;i++) { if(NewStr[i] == 'e') { EFlag = i; break; } } int SignFlag = -1; //次幂 if(NewStr[EFlag+1]=='-' || NewStr[EFlag+1]=='+') SignFlag = EFlag+1; if(SignFlag == len-1) //最后一位是符号 return false; //仅仅是科学计数法,无小数点 if(EFlag && DotFlag==0) { for(int i=0;i<len;i++) { if(i==EFlag || i==SignFlag) continue; else { if(!(NewStr[i]>='0' && NewStr[i]<='9')) return false; } } return true; } else //科学计数法加小数点 { for(int i=0;i<len;i++) { if(NewStr[i] == '.') { DotFlag = i; break; } } if(DotFlag==0 && EFlag==1) //针对 .e3 这样的情况 return false; if(DotFlag > EFlag) //针对 3e. 这样的情况 return false; for(int i=0;i<len;i++) { if(i==EFlag || i==SignFlag || i==DotFlag) continue; else { if(!(NewStr[i]>='0' && NewStr[i]<='9')) return false; } } return true; } } }};
以及评论区的简短代码:
bool isNumber(const char *s) { int i = 0; // skip the whilespaces for(; s[i] == ' '; i++) {} // check the significand if(s[i] == '+' || s[i] == '-') i++; // skip the sign if exist int n_nm, n_pt; for(n_nm=0, n_pt=0; (s[i]<='9' && s[i]>='0') || s[i]=='.'; i++) s[i] == '.' ? n_pt++:n_nm++; if(n_pt>1 || n_nm<1) // no more than one point, at least one digit return false; // check the exponent if exist if(s[i] == 'e') { i++; if(s[i] == '+' || s[i] == '-') i++; // skip the sign int n_nm = 0; for(; s[i]>='0' && s[i]<='9'; i++, n_nm++) {} if(n_nm<1) return false; } // skip the trailing whitespaces for(; s[i] == ' '; i++) {} return s[i]==0; // must reach the ending 0 of the string}
阅读全文
1 0
- LeetCode --- 65. Valid Number
- [Leetcode] 65. Valid Number
- [LeetCode]65.Valid Number
- Leetcode-65.Valid Number
- 【leetcode】65.Valid Number
- leetcode 65. Valid Number
- LeetCode 65. Valid Number
- Leetcode 65. Valid Number
- LeetCode 65. Valid Number
- LeetCode - 65. Valid Number
- [LeetCode] 65. Valid Number
- leetcode 65.Valid Number
- leetcode 65. Valid Number
- leetcode 65.Valid Number
- Leetcode--65. Valid Number
- leetcode-65. Valid Number
- Leetcode 65. Valid Number
- 【LeetCode】65. Valid Number
- 实例解析OOP程序设计七大设计原则(一)
- python入门基础——字符串和编码
- pandas处理大数据的一些小技巧
- position absolute relative的区别
- 启动Apache时出现:(OS 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 : AH00072: make_sock: could not bind to address
- LeetCode | 65. Valid Number
- HTML5 新特性大全
- 1_twoSum
- mysql中文乱码的解决方法
- easyui怎么将前台表单数据传递给后台?
- 给一个整数数组,输出所有可能的子集
- 买房时补充协议写哪些?合同七大条款要注意!
- 【Linux】红帽7搭建网络YUM源
- 1.18Android 学习+进度之十八-IP框添加,并测试