[LeetCode]Valid Number有效数字

来源:互联网 发布:支持mac系统的网游 编辑:程序博客网 时间:2024/05/01 02:30

这道题是leetcode一个大坑,之前做过一次,总是差一点,后来放弃了。。今天拿出来终于写出来了

逻辑是:

1.首先把两边空格去掉

2. 判断下有没有正负号,如果有,跳过

3. 设置3个flag, 是不是Num,有没有"e",有没有" ."

这段逻辑稍微绕点,特别是当你一点点往下写,还不知道test case里到底有什么,最后就越来越乱,我重写的时候没看以前代码,这样还好点。。

首先分析下,什么是一个valid的number:

  (1)"."只能有一个但是必须和数存在 只有一个".",false, '1.' true, '.2' true, '..' false '2.5' true

(2)"e"只有有一个,必须两边都有数,而且e后面的数可以有正负号"1e-10" true, 'e9' false, '7e' false

(3)"e" 和 '.'  可以有"45.e9",true, 但是不可以"45e9." why?我也不知道,我总觉"45.e9"也不是很对

如果我们知道了通关条件就是上面3个,那么就好办了

按照逻辑来,我们只要每次判断s.charAt(index)当前位置的字符char是什么就可以了,这样我们可以储存状态,通过状态来判断是否是一个有效数字


public static boolean isNumber(String s) {if (s == null)return false;int start = 0, end = s.length() - 1;while (start <= end && s.charAt(start) == ' ') {start++;}while (end >= start && s.charAt(end) == ' ') {end--;}if (start > end)return false;boolean hasNum = false;boolean hasE = false;boolean hasDot = false;if (s.charAt(start) == '+' || s.charAt(start) == '-') {start++;}// first judge +/-while (start <= end) {if (s.charAt(start) >= '0' && s.charAt(start) <= '9') {// is numberhasNum = true;} else if (s.charAt(start) == 'e') {if (hasE || !hasNum)return false;hasE = true;hasNum = false;} else if (s.charAt(start) == '.') {if (hasDot || hasE)return false;hasDot = true;} else if (s.charAt(start) == '+' || s.charAt(start) == '-') {if (s.charAt(start - 1) != 'e')return false;} else {return false;}start++;}return hasNum;}


0 0
原创粉丝点击