• [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

  • 相关阅读:
    linux安装mongodb磁盘空间不足
    ccf颁奖晚会
    Bug总结流程
    测试自学过程
    一个div,包含两个div,调整文字位置和div平均分布
    一个div,包含三个小的div,平均分布的样式
    测试成长之路
    k8s常用命令记录
    K8S 1.20.6安装dashboard(基于kubernetes-dashboard 2.0.0版本)
    F. Programming Contest
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3534768.html
Copyright © 2020-2023  润新知