Leet Code OJ: Valid Number
2015-11-02 16:55
387 查看
题目:
补充:true: .1 3. 46.e3 +.8
false: .e1 0e 0.e
我的代码
结果:
state: Accepted
runtime:12ms
我的思路:
既然是要符合规则,那么针对特定的符号,如+/-、e/E、.等只要满足它在其相应坐标位置符合规范,那么就可以考虑整体的规范性了。
考虑特定符号在其坐标位置的规范性,只需往前推理其处在这个位置是否合理即可,若连这个都无法满足,则完全可判定其不合格。
当局部满足要求时再判断整体组合是否满足要求即可。
我的总结:
虽然代码较长,但是运行时间却在意料之外。代码中有些判断条件其实是重复的,可以省略。网上有看到更优秀的代码,需学之~~
补充:true: .1 3. 46.e3 +.8
false: .e1 0e 0.e
我的代码
class Solution { public: bool isNumber(string s) { //去除首尾空格 size_t first_i = 0, last_i = s.length(); while (s[first_i] == ' ' && first_i < last_i){ first_i++; }//while while (s[last_i - 1] == ' ' && last_i >= 0){ last_i--; }//while size_t i; unsigned int jia_jian_num1 = 0; //记录在最前面的+或-号的数目和坐标 int jia_jian_pos1 = 0; unsigned int jia_jian_num2 = 0; //记录在指数e或E后面的+或-号的数目和坐标nt int jia_jian_pos2 = 0; unsigned int dian_num = 0; //记录'.'的数目和坐标 int dian_pos = 0; unsigned int e_num = 0; //记录e或E的数目和坐标 int e_pos = 0; unsigned int digit_num = 0; //记录数字 for (i = first_i; i<last_i; i++) { if (s[i] == '+' || s[i] == '-') //存在+或-号,则+或-号只能在最前面或是前面有e或E { //+或-号在字符最前面,则在该位置合法 if ((i - first_i) == 0) { jia_jian_num1++; //记录当前的加减号数目 jia_jian_pos1 = i; //记录坐标 } else if (s[i - 1] == 'e' || s[i - 1] == 'E') //+或-号前面是e或E,该位置也合法 { jia_jian_num2++; jia_jian_pos2 = i; } else{ //既不是最前面也不是在指数e或E的后面 //break; return false; } if ((jia_jian_num1 > 1) || (jia_jian_num2 >1)){ //+和-的数目加起来超过1,表明2种情况中是不合法的 // break; return false; } } else if (s[i] == '.'){ //存在'.'号,则'.'的前面一定存在数字,否则就是不合法 if ((i == first_i) || (isdigit(s[i - 1])) || s[i - 1] == '+' || s[i - 1] == '-'){ //'.'在最前面或前面的字符是数字或+/-,则在该位置合法 dian_num++; dian_pos = i; } else{ //其他条件均不合法 //break; return false; } if (dian_num >1){ //'.'的数目不可能超多1,否则不合法 // break; return false; } } else if (s[i] == 'e' || s[i] == 'E') //存在e或E, e或E的前面一定是数字 { if ((i != first_i) && (isdigit(s[i - 1]) || s[i - 1] == '.')) //e的前面有数字则在该位置合法 { e_num++; e_pos = i; } else{ //其他条件下均不合法 //break; return false; } if (e_num >1){ //e或E的数目最多也只能为1 // break; return false; } } else if (isdigit(s[i])){ //该字符是数字 digit_num++; } else{ //既不是+或-号、也不是'.'、也不是e或E、更不是数字, 则该字符一定不合法 //break; return false; } }//for //尽管在+或- 、'.'、e或E在相应坐标下符合,但不一定组合在一起就规范,比如+3.1e、1e+ 2e-2.1 -3e+ //发现,若存在在+或- 、'.'、e或E的话,则排序规则是 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] ,其中x表示数字,[xx]表示有多位数字可选 if (digit_num == (last_i - first_i)){ //全是数字 return true; } if (digit_num == 0){ return false; } //不全是数字的情况 if ((last_i - first_i - digit_num) == 4) { //4种符号都存在 //第一:按照 +/-(1)x[xx].[xxxx]e+/-(2)x[xx] 或 +/-(1)[xxx].x[xxx]e+/-(2)x[xx] 的规则组成的合法排序 if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i) || ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i))) { return true; } else{ return false; } } else if ((last_i - first_i - digit_num) == 3) { //有一种符号不存在 //第一:若+/1(1)不存在,则正确的排序是x[xx].x[xxx]e+/-(2)x[xx] if (jia_jian_num1 == 0) { //按照 [xxx].[xxxx]e+/-(2)x[xx] 的规则组成的合法排序 if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 0)) { return true; } else{ return false; } } else if (jia_jian_num2 == 0) { //第二:若+/-(2)不存在,则正确的排序是+/-(1)[xxx].x[xxx]ex[xx]或+/-(1)x[xx].[xxx]ex[xx] if ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - jia_jian_pos1 >= 2) && (jia_jian_pos1 == first_i))) { return true; } else{ return false; } } else if (e_num == 0) { //第三:若e或E不存在,则+/-(2)一定不存在,所以该种情况不合法 return false; } else { //第四:若'.‘不存在,则正确的排序是+/-(1)x[xxx]e+/-(2)x[xx] if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i)) { return true; } else{ return false; } } } else if ((last_i - first_i - digit_num) == 2) //2种符号不存在 { //经分析,以下4中情况符合要求 if ((jia_jian_num1 == 1) && (dian_num == 1)) //正确的排序规则: +/-(1)[xxx].x[xxx] { if ((last_i - 1 > e_pos) && (dian_pos - jia_jian_pos1 >= 1) && (jia_jian_pos1 == first_i)) { return true; } else { return false; } } else if ((jia_jian_num1 == 1) && (e_num == 1)) { //正确的排序规则:+/-(1)x[xxx]ex[xx] if ((last_i - 1 > e_pos) && (e_pos - jia_jian_pos1 >2) && (jia_jian_pos1 == first_i)) { return true; } else { return false; } } else if ((dian_num == 1) && (e_num == 1)) { //正确的排序规则:[xxx].x[xxx]ex[xx] 或 x[xx].[xxx]ex[xx] if (((last_i - 1 > e_pos) && (e_pos - dian_pos >= 2) && (dian_pos - first_i >= 0)) || ((last_i - 1 > e_pos) && (e_pos - dian_pos >= 1) && (dian_pos - first_i >= 1))) { return true; } else { return false; } } else if ((e_num == 1) && (jia_jian_num2 == 1)) { //正确的排序规则:x[xxx]e+/-(2)x[xx] if ((last_i - 1 > jia_jian_pos2) && (jia_jian_pos2 - e_pos == 1) && (e_pos > first_i)) { return true; } else{ return false; } } else { return false; } } else if ((last_i - first_i - digit_num) == 1) { //3种符号不存在,则存在以下3中情形 if (jia_jian_num1 == 1){ //形如+x[xx] if (s.length() >= 2){ return true; } else{ return false; } } else if (dian_num == 1){ //形如[xxx].x[xx] if (s.length() >= 2){ return true; } else{ return false; } } else if (e_num == 1){ //形如 x[xx]ex[xx] if (e_pos > first_i && e_pos < last_i - 1){ return true; } else{ return false; } } else{ //+/-(2)是不合法的 return false; } } else { //不存在符号,全是数字 return true; } } };
结果:
state: Accepted
runtime:12ms
我的思路:
既然是要符合规则,那么针对特定的符号,如+/-、e/E、.等只要满足它在其相应坐标位置符合规范,那么就可以考虑整体的规范性了。
考虑特定符号在其坐标位置的规范性,只需往前推理其处在这个位置是否合理即可,若连这个都无法满足,则完全可判定其不合格。
当局部满足要求时再判断整体组合是否满足要求即可。
我的总结:
虽然代码较长,但是运行时间却在意料之外。代码中有些判断条件其实是重复的,可以省略。网上有看到更优秀的代码,需学之~~
相关文章推荐
- 最小生成树(Prim算法和Kruskal算法)
- 无法嵌入互操作类型“Microsoft.Office.Interop.Word.ApplicationClass”。请改用适用的接口。
- 服务器监控客户端系统状态5.0
- HTTP协议详解之基本认证篇
- linux 不同版本配置VNC
- 第8周实践项目2 - 建立链串的算法库
- 第十周项目3-利用二叉树遍历思想解决问题
- AIDL初探(本地、进程)
- 新手编程看看
- 多维数组名可以直接赋值给指针变量吗?
- 定制Android系统开发之八——实现从JNI到Java的回调
- GPI将在明年举行全球扑克联赛
- cpanel导入大数据库(mysql)的方法
- 第九周项目2对称矩阵压缩存储的实现与应用(1)
- 第6周项目4 数字转换(栈)
- 第十周项目1--二叉树算法库
- 安全测试 -web
- poj 1003 1004 1005水
- JTable中 表头中添加 JCheckBox 全选 功能
- NYOJ-21-三个水杯【BFS】