Leetcode 065 Valid Number(模拟)

题目连接:Leetcode 065 Valid Number

解题思路:模拟,首先去除字符串的前后空格,再删除首位符号(如果存在的话)。

遍历一遍处理过的字符串,确定是否是科学计数法和是否为浮点数,并记录e和小数点的位置。其中:

- 多个小数点的情况是非法的,多个e的情况也是非法的

- 碰到‘-’或‘+’只有在科学计数法的情况下才有效(开头的符号已经被移除)

- 剩下的字符,除了‘0’~‘9’都是非法的

最后,判断小数点和e的位置是否合理,判断小数点前后的字符串或者e前后的字符串是否合理。

class Solution {
	public:
		bool isNumber(string s) {
			int n = s.size();
			cout << s << endl;

			// Extra space
			int start = 0, end = n - 1;
			while (start < n && s[start] == ' ') start++;
			while (end >= start && s[end] == ' ') end--;
			if (start > end) return false;
			s = s.substr(start, end - start + 1);

			// Signale
			if (s[0] == '-' || s[0] == '+') s = s.substr(1);
			if (s.size() == 0) return false;

			bool is_science = false, is_float = false;
			int p_science, p_float;
			for (int i = 0; i < s.size(); i++) {
				if (s[i] == '.') {
					if (is_float) return false;
					else { is_float = true, p_float = i; }
				} else if (s[i] == 'e') {
					if (is_science) return false;
					else { is_science = true, p_science = i; }
				} else if (s[i] >= '0' && s[i] <= '9') {
					continue;
				} else if (s[i] == '-' || s[i] == '+') {
					if (is_science == false) return false;
				} else {
					return false;
				}
			}

			// (float e float) is invalid.
			if (is_science && is_float && p_science < p_float) return false;

			if (is_science) {
				// ( e float) and (float e) are invalid.
				if (p_science == 0 || p_science + 1 == s.size()) return false;
				return isNumber(s.substr(0, p_science)) && isNumber(s.substr(p_science+1));
			}

			// (.) is invalid.
			if (is_float && s.size() == 1) { return false; }

			return true;
		}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值