[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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//java正则表达式数字验证 public boolean isNumber(String str) { java.util.regex.Pattern pattern=java.util.regex.Pattern.compile("[0-9]+(.[0-9]+)?"); java.util.regex.Matcher match=pattern.matcher(str); if(match.matches()==false) { return false; } else { return true; } } ------------------------------------------------------------------------------------------------------ [removed] function validate(){ var reg = new RegExp("^[0-9]*$"); var obj = document.getElementById("name"); if(!reg.test(obj.value)){ alert("请输入数字!"); } if(!/^[0-9]*$/.test(obj.value)){ alert("请输入数字!"); } } [removed] ------------------------------------------------------------------------------------------------------ 验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9][0-9]*)$ 验证有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 验证有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 验证非零的正整数:^\+?[1-9][0-9]*$ 验证非零的负整数:^\-[1-9][0-9]*$ 验证非负整数(正整数 + 0) ^\d+$ 验证非正整数(负整数 + 0) ^((-\d+)|(0+))$ 验证长度为3的字符:^.{3}$ 验证由26个英文字母组成的字符串:^[A-Za-z]+$ 验证由26个大写英文字母组成的字符串:^[A-Z]+$ 验证由26个小写英文字母组成的字符串:^[a-z]+$ 验证由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 验证由数字、26个英文字母或者下划线组成的字符串:^\w+$ 验证用户密码:^[a-zA-Z]\w{5,17}$ 正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 验证是否含有 ^%&',;=?$\" 等字符:[^%&',;=?$\x22]+ 验证汉字:^[\u4e00-\u9fa5],{0,}$ 验证Email地址:^\w+[-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 验证InternetURL:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ;^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$ 验证电话号码:^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$:--正确格式为:XXXX-XXXXXXX,XXXX-XXXXXXXX,XXX-XXXXXXX,XXX-XXXXXXXX,XXXXXXX,XXXXXXXX。 验证身份证号(15位或18位数字):^\d{15}|\d{}18$ 验证一年的12个月:^(0?[1-9]|1[0-2])$ 正确格式为:“01”-“09”和“1”“12” 验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$ 正确格式为:01、09和1、31。 整数:^-?\d+$ 非负浮点数(正浮点数 + 0):^\d+(\.\d+)?$ 正浮点数 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 非正浮点数(负浮点数 + 0) ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 负浮点数 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 浮点数 ^(-?\d+)(\.\d+)?$

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值