【todo+低频题】剑指offer——面试题54:表示数值的字符串

力扣,https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/description/
场景极其繁琐,有空再看。。。

class Solution {
    public boolean validNumber(String s) {
        if (s == null || s.length() == 0) {
            return false;
        }
        s = s.trim(); //去掉首尾空格
        boolean numFlag = false;
        boolean dotFlag = false;
        boolean eFlag = false;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') { // 判定为数字,则标记numFlag
                numFlag = true;
            } else if (s.charAt(i) == '.' && !dotFlag && !eFlag) { // 判定为.  需要没出现过.并且没出现过e
                dotFlag = true;
            } else if ((s.charAt(i) == 'e' || s.charAt(i) == 'E') 
                    && !eFlag && numFlag) { // 判定为e,需要没出现过e,并且出过数字了
                eFlag = true;
                numFlag = false;            //为了避免123e这种请求,出现e之后就标志为false
            } else if ((s.charAt(i) == '+' || s.charAt(i) == '-') 
                    && (i == 0 || s.charAt(i - 1) == 'e' || s.charAt(i - 1) == 'E')) { //判定为+-符号,只能出现在第一位或者紧接e后面
            } else { // 其他情况,都是非法的
                return false;
            }
        }
        return numFlag;
    }
}

参考网址:https://www.nowcoder.com/profile/9717187/codeBookDetail?submissionId=15761119
利用特殊字符把字符串分割为整数段这个思想值得借鉴!

class Solution {
public:
    bool isNumeric(char* string)
    {
        if(string == NULL) //空指针返回false
            return false;
        if(*string == '+' || *string == '-')
            string++;
        if(*string == '\0') //若只有符号位则返回false
            return false;
        int dot = 0, num = 0, nume = 0;//分别用来标记小数点、整数部分和e指数是否存在
        while(*string != '\0') { //利用特殊字符把字符串分割为整数段这个思想值得借鉴!
            if(*string >= '0' && *string <= '9') //出现了数字,则指针往后移
            {                                    //同时num = 1代表出现了整数部分
                string++;
                num=1;
            }
            else if(*string == '.'){
                if(dot > 0 || nume > 0) //如果存在已经存在小数点或e指数则返回false。注:此题在书中规定中如"-.123"也被判定为数值
                    return false;       //即有的小数没有整数位,也被判定为合法数值所以没有"num == 0 ||"这个条件
                string++;//否则指针后移
                dot=1; //并标记出现了小数点
            }
            else if(*string == 'e' || *string == 'E')
                {
                  if(num == 0 || nume > 0) //如果没有整数部分或已经存在e指数
                      return false;        //返回false
                  string++;//否则指针后移
                  nume++; //并标记已经出现了e指数
                  if(*string == '+' || *string == '-')
                      string++;//如果出现了正负号,指针后移
                  if(*string == '\0') //如果e指数后面字符串直接结束,返回false
                      return false;   //如果e后面有符号位,然后符号位直接结束,返回false
                }
            else
                return false;
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值