[LeetCode]Valid Number有效数字

这道题是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 number
				hasNum = 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;

	}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值