美文网首页LeetCode
65. Valid Number

65. Valid Number

作者: 小万叔叔 | 来源:发表于2017-02-05 14:51 被阅读1次
/*
65. Valid Number
Validate if a given string is numeric.

Some examples:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true

*/
/*
Thinking:
内容里面只包含空格,dot, 字母e。
多个dot 会失败。
多个e 会失败。
最后一个是dot 或 e 会失败。
其他字母会失败。
全空格会失败。

如果线性扫描,遇到字母就停止,遇到空格则停止,然后用栈结构
记录

*/

func isNumber(_ s: String) -> Bool {
    //Error3: 由于前后空格很麻烦,所以直接去掉前后空格更好处理
    let s = s.trimmingCharacters(in: NSCharacterSet.whitespaces)
    let length = s.lengthOfBytes(using: .ascii)
    guard length > 0 else {
        return false
    }

    var numberCount = 0
    //数字 0~9,dot, e, -, + 空格 都为合法
    //返回 (是否合法, 是否可用特殊字符 dot e - + )
    //Error3: 中间有空格认为不合法
    func isValidNumber(_ char: Character) -> (Bool, Bool) {
        if (char >= "0" && char <= "9") {
            numberCount += 1
            return (true, false)
        }

//        if char == " " {
//            if numberCount == 0 {
//                return (true, false)
//            }
//        }

        if char == "." || char == "e" || char == "-" || char == "+" {
            return (true, true)
        }

        return (false, false)
    }

    /*
    这个栈结构用来存储特殊内容例如. e - +
    1. 最后一位不能是这些,
    2. . 签名需要栈为空
    3. e 之前需要栈为空, e之前需要有数字
    4. - + 之前需要是e,或者为空
    5. Error2: 最后一位是. 或者最前一位是.认为合理
    6. Erorr4: .前面可以允许-,+
    7. 由于每种字符的情况都不一样,所以分开写case,更合理些
    9. Error5: + - 前面不能有数字
    10. Error6: "3.5e+3.5e+3.5" 栈结构里面不能包含多重, 也就是 . 前面不能有e
    */
    //这个栈结构用来存储特殊内容例如. e - + ,
    //存储字符+ 在字符串中的位置
    var pointStack: [Character] = []

    //由于前面已经过滤,所以默认这里输入的只有. e - + , 不能单独抽离这个函数出去
    func isValidPoint(_ char: Character, _ index: Int) -> Bool {
        if index == length - 1, char != "." {
            //如果是最后一个
            return false
        }

        if char == "e" {
            if numberCount == 0 {
                return false
            }
            //Error6, 46.e3 合法,所以e前面可以有.
            if let last = pointStack.last, last == "e" {
                return false
            }
        }

        if char == "." {
            if let last = pointStack.last, last != "-", last != "+" {
                return false
            }

            if pointStack.contains("e") {
                return false
            }
        }

        if char == "-" || char == "+" {
            if let last = pointStack.last, last != "e" {
                return false
            }

            if pointStack.count == 0, numberCount != 0 {
                return false
            }
        }

        pointStack.append(char)
        return true
    }

    for (index, value) in s.characters.enumerated() {
        let (isNumber, isPoint) = isValidNumber(value)
        if !isNumber {
            return false
        }

        if isPoint, !isValidPoint(value, index) {
            return false
        }
    }

    //Error: 没有任何数字
    if numberCount == 0 {
        return false
    }

    return true
}

//"0" => true
//" 0.1 " => true
//"abc" => false
//"1 a" => false
//"2e10" => true
//print(isNumber("0"))
//print(isNumber(" 0.1 "))
//print(isNumber("abc"))
//print(isNumber("1 a"))
//print(isNumber("2e10"))
//print(isNumber("  "))
print(isNumber("3.5e+3."))

相关文章

网友评论

    本文标题:65. Valid Number

    本文链接:https://www.haomeiwen.com/subject/vadeittx.html