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.

分析:http://blog.csdn.net/linhuanmars/article/details/23809661

这是一道检查字符串输入是否为合法的题目。基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。
对于小数点出现的时候,我们要满足一下这些条件:(1)前面不能有小数点或者‘e’和‘E’;(2)前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。
对于正负号出现的情况,要满足条件:(1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字。
对于‘e’和‘E’的情况,要满足:(1)前面不能有‘e’和‘E’出现过;(2)不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。
根据上面列举的情况,我们用两个标签和做前后位的判断来实现,算法复杂度比较明显是O(n)的,只需要O(1)的额外空间。代码如下:

代码:http://ideone.com/7MIXt6

 public class Solution {
static boolean isNumber(String s) {
if (s == null || s.trim().length() == ) return false;
s = s.trim();
int n = s.length(), opCount = ;
boolean hasE = false, hasNum = false, hasPoint = false; // Go through the characters
for (int i = ; i < n; i++) {
char ch = s.charAt(i);
// input value
if (!(ch <= '' && ch >= '' || ch == '.' || ch == 'e' || ch == 'E' || ch == '+' || ch == '-'))
return false; // number
if (ch >= '' && ch <= '')
hasNum = true; // Case e/E
// (1) 前面不能有‘e’和‘E’出现过;(2)前面不能没数字或者最后一位(后面没数字就不用写指数了)。
if (ch == 'e' || ch == 'E') {
if (hasE || !hasNum || i == n - ) return false;
hasE = true;
} // Case decimal point
// (1) 前面不能有小数点或者‘e’和‘E’;(2)单独的decimal point 不是valid数字。
if (ch == '.') {
if (hasPoint || hasE || i == n - && !hasNum) return false;
hasPoint = true;
} // Case sign
// (1)必须是第一位或者在‘e’和‘E’后一位;(2)后一位要是数字
if (ch == '+' || ch == '-') {
if (opCount == || i == n - ) return false;
if (i > && !(s.charAt(i - ) == 'E' || s.charAt(i - ) == 'e')) return false;
opCount++;
}
}
return true;
}
}

最新文章

  1. IP数据报首部解析
  2. BAT文件执行完成后如何删除自身的解决办法
  3. 【转】iOS开发拓展篇—静态库
  4. Javascript对象的声明
  5. spring学习笔记二 注解及AOP
  6. Flask Web框架
  7. Go 嵌入类型
  8. 根据导出的查询结果拼接字符串,生成sql语句并保存到txt文件中
  9. Idea中重建maven模块,dependencies引入为空的解决办法
  10. PHP序列化变量的4种方法
  11. ClassLoader加载资源时的搜索路径
  12. 使用EventLog Analyzer进行VMware日志管理
  13. DIM-00014: Cannot open the Windows NT Service Control Manager.
  14. 绝对定位常见误区:position:absolute相对于谁定位、及当溢出时怎么隐藏
  15. 【CTF WEB】GCTF-2017读文件
  16. centos7,yum安装工具报错
  17. Java工具-----native2ascii
  18. Mybatis处理列名—字段名映射— 驼峰式命名映射
  19. c9.io
  20. 2.2 Rust 数据类型

热门文章

  1. NopCommerce Url分析
  2. jsp系统时间和时间对比(活动结束不结束)
  3. xStream完美转换XML、JSON
  4. 10个基础的linux网络和监控命令
  5. 昨天所写的JQ 点击隐藏事件,关键性原理
  6. PHP如何实现页面静态化
  7. php 经典的算法题你懂的
  8. [设计模式] javascript 之 桥接模式
  9. JavaScript-也来谈--闭包
  10. RelativeLayout布局