LeetCode 65 Valid Number

54 篇文章 2 订阅
10 篇文章 0 订阅

思路

需要考虑一些cases,以下例来编写该题的算法:+2.5e+5。首先用trim将两端的空格去掉,遇到+/-时单独判断;在判断2.5这种浮点数的时候,只需要统计是.和数字的部分,即sc[1]~sc[3],统计.和数字的个数,小数点只能有一个,数字个数需要大于0,不符合条件的可以直接返回false。然后判断e,后面需要接内容,不能以e结束,所以在这里判断一次:i == len。在最后只需要判断i是否等于len即可:i == len为true,否则为false。
【小技巧:为了防止在以上每次判断的时候由于i++而可能导致下一次判断的数组越界,在一开始的时候在sc数组后面加一个空格即可】

复杂度

时间复杂度O(n), 空间复杂度O(n)

代码

public class Solution {
    /**
     * @param s: the string that represents a number
     * @return: whether the string is a valid number
     */
    public boolean isNumber(String s) {
        // write your code here
        if(s == null || s.length() == 0) {
            return false;
        }
        // " " is to avoid array index out of bound.
        s = s.trim() + " ";
        char[] sc = s.toCharArray();
        int len = sc.length - 1;
        
        int i = 0;
        if(sc[i] == '+' || sc[i] == '-') {
            i++;
        }
        
        int num_point = 0, num_digit = 0;
        while(Character.isDigit(sc[i]) || sc[i] == '.') {
            if(Character.isDigit(sc[i])) {
                num_digit++;
            } else {
                num_point++;
            }
            i++;
        }
        if(num_point > 1 || num_digit < 1) return false;
        
        if(sc[i] == 'e') {
            i++;
            if(sc[i] == '+' || sc[i] == '-') {
                i++;
            }
            if(i == len) return false;
            while(i < len) {
                if(!Character.isDigit(sc[i])) return false;
                i++;
            }
        }
        
        return (i == len);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值