zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    Mac OS X上安装配置apache服务器
    eclipse 发布web工程,修改tomcat端口
    masonry瀑布流的使用
    fullcalendar 使用教程
    -webkit-line-clamp下多行文字溢出点点点...显示实例页面
    HTML5 Audio标签方法和函数API介绍
    Canvas与Image互相转换
    iOS绘图UIBezierPath 和 Core Graphics框架
    实现外卖选餐时两级 tableView 联动效果
    零行代码为 App 添加异常加载占位图
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3534768.html
Copyright © 2011-2022 走看看