[LeetCode][Java] Valid Number

题目:

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.

题意:

验证给定的字符串是否表示一个数。

一些例子:

"0" => true

" 0.1 " => true

"abc" => false

"1 a" => false

"2e10" => true

注意: 问题的描述不是特别的明确,在实现算法之前,你需要收集所有的要求。

算法分析:

当时第一遍刷leetcode的时候,这个题是通过率最低的一道。AC之后才发现,不是算法本事特别的复杂,是测试的样例各种各样,想不到啊。不提交都没法调试。算法不

复杂,只要你把所有的情况都能想到就行。真是为了AC而AC。

这当然不是搞算法的人应有的态度(囧)。正确的套路好像是先分析问题,再解决问题哦。

参考http://pisxw.com/algorithm/Valid-Number.html

基本规则是按照科学计数法,所以会出现的特殊字符有以下几个:符号位‘+’,‘-’,小数点‘.’,还有‘e’和‘E’,剩下的就只有数字0-9了,其他字符如果出现就是非法字符,返回false。数字字符在哪里出现都是ok的,我们主要考虑几个特殊字符的情况。

对于小数点出现的时候,我们要满足一下这些条件:

1. 前面不能有小数点或者‘e’和‘E’;

2. 前一位是数字(不能是第一位)或者后一位要是数字(不能是最后一位)。

对于正负号出现的情况,要满足条件:

1. 必须是第一位或者在‘e’和‘E’后一位;

2. 后一位要是数字。

对于‘e’和‘E’的情况,要满足:

1. 前面不能有‘e’和‘E’出现过;

2. 不能是第一位(前面没数字科学计数没有意义)或者最后一位(后面没数字就不用写指数了)。

AC代码:

public class Solution {
    public boolean isNumber(String s) {
        if(s==null)
            return false;
        s = s.trim();
        if(s.length()==0)
            return false;
        boolean dotFlag = false;
        boolean eFlag = false;
        for(int i=0;i<s.length();i++)
        {
            switch(s.charAt(i))
            {
                case '.':
                    if(dotFlag || eFlag
                    || ((i==0||!(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'))
                        && (i==s.length()-1||!(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'))))
                        return false;
                    dotFlag = true;
                    break;
                case '+':
                case '-':
                    if((i>0 && (s.charAt(i-1)!='e' && s.charAt(i-1)!='E'))
                      || (i==s.length()-1 || !(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||s.charAt(i+1)=='.')))
                        return false;
                    break;
                case 'e':
                case 'E':
                    if(eFlag || i==s.length()-1 || i==0)
                        return false;
                    eFlag = true;
                    break;
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                    break;
                default:
                    return false;
            }
        }
        return true;
    }
}

这里也把自己第一遍AC的代码贴出来吧,全当是记录了

public class Solution
{
    public boolean isNumber(String s)
    {
		int dotnum=0;
		int expnum=0;
		int signnum=0;
		String tems="";
		String nosigns="";
		s=s.trim();
	    if(s==null||s.length()==0)
			return false;
		for(int i=0;i<s.length();i++)
		{
			if(s.charAt(i)>='0'&&s.charAt(i)<='9')
			{
				continue;
			}
			else if(s.charAt(i)=='-'&&i==0||s.charAt(i)=='+'&&i==0)
			{
				signnum++;
				if(signnum>1)
					return false;
				nosigns=s.substring(1);
				s= new String(nosigns);
				i=-1;
			}
			else if(s.charAt(i)=='e')
			{
				expnum++;
				if(expnum>1)
					return false;
				if(i-1>=0&&i+1<=s.length()-1)
				{
				  if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9'&&s.charAt(i+1)>='0'&&s.charAt(i+1)<='9'||s.charAt(i-1)=='.'||(s.charAt(i+1)=='-'&&i+1!=s.length()-1)||(s.charAt(i+1)=='+'&&i+1!=s.length()-1))
					{
						if(s.charAt(i+1)=='+'||s.charAt(i+1)=='-')
							i++;
						if(!s.substring(i).contains("."))
							continue;
						else
							return false;
					}
				    else
						return false;
				}
				else
					return false;
			}
			else if(s.charAt(i)=='.')
			{
				dotnum++;
				if(dotnum>1)
					return false;
				if(i-1>=0||i+1<=s.length()-1)
				{
					if(i-1>=0)
					{
						if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')
							continue;
						else
							return false;
					}
					if(i+1<=s.length())
					{
						if(s.charAt(i+1)=='e')
						{
							if(i-1>=0)
							{
								if(s.charAt(i-1)>='0'&&s.charAt(i-1)<='9')
									continue;
								else
									return false;
							}
							else
								return false;
						}
						else if(s.charAt(i+1)>='0'&&s.charAt(i+1)<='9')
							continue;
						else
							return false;
					}
				}
				else
					return false;
			}
			else
				return false;
		}
		return true;
    }
}

版权声明:本文为博主原创文章,转载注明出处

时间: 2024-10-18 15:46:50

[LeetCode][Java] Valid Number的相关文章

LeetCode:Valid Number - 判断字符串中内容是否为数字

1.题目名称 Valid Number(判断字符串中内容是否为数字) 2.题目地址 https://leetcode.com/problems/valid-number/ 3.题目内容 英文:Validate if a given string is numeric. 中文:给出一个字符串,检查这个字符串中内容是否是一个数字 例如:"0"." 0.1"."2e10"是数字,"abc"."1 a"不是数字 4

LeetCode --- 65. Valid Number

题目链接:Valid Number 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 statemen

leetCode 65.Valid Number (有效数字)

Valid Number 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

[LeetCode][JavaScript]Valid Number

https://leetcode.com/problems/valid-number/ Valid Number Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => true"abc" => false"1 a" => false"2e10" => true Note: It is

【leetcode】Valid Number

Valid Number 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 am

Java for LeetCode 065 Valid Number

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.

[LeetCode] 65. Valid Number Java

题目: 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.

[Leetcode][JAVA] Valid Palindrome

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example,"A man, a plan, a canal: Panama" is a palindrome."race a car" is not a palindrome. Note:Have you consider that th

【LeetCode】Valid Number 解题报告

[题目] 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 ambig