• [Leetcode]-- Valid Number


    package validNumber;
    
    public class Solution {
        public boolean isNumber(String s) {
            if (s == null)
                return false;
    
            char[] sArr = s.trim().toCharArray();
    
            if (sArr.length == 0)
                return false;
    
            // if string 长度为1 且不是数字
            if (sArr.length == 1 && !Character.isDigit(sArr[0]))
                return false;
    
            boolean decimalFound = false; // flag 标记是否遇到过 '.'
            boolean eFound = false; // flag 标记是否遇到过 'e'
    
            // 遍历string的每一个character
            int end = sArr.length - 1;
            for (int i = 0; i <= end; i++) {
    
                // 当前character 一前一后两个指针。 指针超出设为'x'
                char nextChar = (i >= end ? 'x' : sArr[i + 1]);
                char prevChar = (i <= 0 ? 'x' : sArr[i - 1]);
                switch (sArr[i]) {
                // '+' and '—' 只可以放在数字最左边或是 'e'的右边
                case '+':
                case '-':
                    // 不在'e' 的右边和开头
                    if (prevChar != 'e' && i != 0)
                        return false;
                    // 在末尾
                    if (i == end)
                        return false;
                    // 早开头 但是next 不是 '.' 也不是数
                    if (i == 0 && nextChar != '.' && (!Character.isDigit(nextChar)) )
                        return false;
                    break;
    
                case '.':
                    // 出现过'.' or 'e' 就不能出现'.' 了
                    if (decimalFound || eFound)
                        return false;
                    // '.' 前面不是数且后面不是数
                    if (!Character.isDigit(prevChar)
                            && !Character.isDigit(nextChar))
                        return false;
                    decimalFound = true;
                    break;
                case 'e':
                    // 'e' 出现过就不能再出现了
                    if (eFound)
                        return false;
                    // 'e' 之前又不是数字又不是'.'
                    if (!Character.isDigit(prevChar) && prevChar != '.')
                        return false;
                    // 'e' 之后不是数也不是'+' or '-' return false;
                    if (!Character.isDigit(nextChar)
                            && (nextChar != '-' && nextChar != '+')) {
                        return false;
                    }
                    // 'e' 在开头和结尾
                    if (end == i || i == 0)
                        return false;
                    eFound = true;
                    break;
                // 遇到空格
                case ' ':
                    return false;
                    // 其它情况 不是数 return false
                default:
                    if (!Character.isDigit(sArr[i]))
                        return false;
                }
    
            }
            return true;
        }
    }

    思路 讲String检测所有 false的cases, 如果全通过 return true

  • 相关阅读:
    python学习(四)流程控制语句
    python学习(三)运算符
    python学习(二)数据类型转换
    python学习(一)基本数据类型
    mysql学习-mysql分页查询
    装饰器
    迭代器与生成器
    深入解析类对象与类实例的创建过程
    深入理解Python中的元类---metaclass
    flask源码解析之DispatcherMiddleware
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3534768.html
Copyright © 2020-2023  润新知