[leetcode]65. Valid Number@Java

https://leetcode.com/problems/valid-number/#/description


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.


思路:这道题关键是分析所有会出现的情况。以及设置关键的flag来记录各种情况

首先使用trim()函数去除前后空格。

设置4个标志,分别是

 boolean pointSeen = false;//是否出现过小数点“.”
 boolean eSeen = false;//是否出现过指数标志“e”
 boolean numberSeen = false;//是否出现过数字
 boolean numberAfterE = true;//e后面是否有数字

进行循环s.charAt(i):

1.如果属于[0,9],把numberSeen设为true

2.如果是‘.’,必须之前没有遇到'.'和'e'

3.如果是'e',必须之前没有遇到过'e'

4.如果是'+'或者'-',当前i必须是0,或者i-1上的字符是e

5.其他情况返回false


Java Code:

package go.jacob.day722;

/**
 * 65. Valid Number
 * 
 * @author Jacob
 *
 */
public class Demo1 {
	/*
	 * Runtime: 3 ms.Your runtime beats 83.72 % of java submissions.
	 * 思路:这道题关键是分析所有会出现的情况。以及设置关键的flag来记录各种情况 
	 * 首先使用trim()函数去除前后空格。 
	 * 设置4个标志,分别是
	 * boolean pointSeen = false;//是否出现过小数点“.” 
	 * boolean eSeen =alse;//是否出现过指数标志“e” 
	 * boolean numberSeen = false;//是否出现过数字 
	 * booleannumberAfterE = true;//e后面是否有数字 
	 * 进行循环s.charAt(i):
	 * 1.如果属于[0,9],把numberSeen设为true 
	 * 2.如果是‘.’,必须之前没有遇到'.'和'e'
	 * 3.如果是'e',必须之前没有遇到过'e' 
	 * 4.如果是'+'或者'-',当前i必须是0,或者i-1上的字符是e 
	 * 5.其他情况返回false
	 */
	public boolean isNumber(String s) {
		s = s.trim();
		if (s == null || s.length() == 0)
			return false;
		// 记录是否出现过数字
		boolean numberSeen = false;
		// 是否出现过小数点
		boolean pointSeen = false;
		// 是否出现过指数标志e
		boolean eSeen = false;
		// e后是否出现过数字
		boolean numberAfterE = false;

		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			// 如果是数字
			if (c >= '0' && c <= '9') {
				numberSeen = true;
				numberAfterE = true;
				// 如果是小数点
			} else if (c == '.') {
				if (pointSeen || eSeen)
					return false;
				pointSeen = true;
				// 如果是e,必须没有出现过且出现过数字
			} else if (c == 'e') {
				if (eSeen || !numberSeen)
					return false;
				eSeen = true;
				numberAfterE = false;
				// 如果出现正负号,必须是首位,或者前一位是e
			} else if (c == '+' || c == '-') {
				if (i != 0 && s.charAt(i - 1) != 'e')
					return false;
			} else
				return false;
		}
		return numberSeen && numberAfterE;
	}

	/*
	 * 1.只能有一个小数点,指数不能使小数 2.正负号;3.前后空格;4.只有一个点(.);5.(-.) 我的解法,特别复杂,不推荐
	 */
	public boolean isNumber_1(String s) {
		s = s.trim();
		if (s == null || s.length() == 0)
			return false;
		int index = s.indexOf("e");
		if (index == 0 || index == s.length() - 1)
			return false;

		return index == -1 ? isBase(s, s.length()) : isBase(s, index) && isExp(s, index);
	}

	private boolean isBase(String s, int index) {
		System.out.println("index2:" + index);
		s = s.substring(0, index);
		boolean hasComma = false;
		for (int i = 0; i < s.length(); i++) {
			if (i == 0) {
				if ((s.charAt(0) == '+' || s.charAt(0) == '-')) {
					if (s.length() > 1)
						continue;
					else
						return false;
				} else if (s.charAt(0) == '.')
					if (s.length() > 1) {
						hasComma = true;
						continue;
					} else
						return false;
			}
			if (s.charAt(i) == '.')
				if (!hasComma) {
					hasComma = true;
				} else {
					return false;
				}
			else if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
				continue;
			} else
				return false;
		}
		return true;
	}

	private boolean isExp(String s, int index) {
		s = s.substring(index + 1, s.length());
		for (int i = 0; i < s.length(); i++) {
			if (i == 0 && (s.charAt(0) == '+' || s.charAt(0) == '-')) {
				if (s.length() > 1)
					continue;
				else
					return false;
			}
			if (s.charAt(0) < '0' || s.charAt(0) > '9')
				return false;

		}
		return true;
	}

	public static void main(String[] args) {
		String s = "qwer";
		System.out.println(s.indexOf("r"));
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值