剑指offer算法系列——Swift版本

剑指offer—面试题20:表示数值的字符串

2021-01-11  本文已影响0人  FY_Chao

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值,但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是。

假设字符串为A.BeC或A.BEC, 也就是整数部分为A,小数部分为B,指数部分为C,按顺序判断是否包含这三部分。

class Solution {
    
    var index = 0
    
    func isNumber(_ s: String) -> Bool {
        guard s.count != 0 else {
            return false
        }
       //  将字符串转为字符数组
        let sArray = Array(s)
        // 排除空格
        while  index < sArray.count && sArray[index] == " " {
            index += 1
        }
        // 验证整数部分
        var numeric = scanInteger(sArray)
        
        if  index < sArray.count && sArray[index] == "." {
            index += 1
            // 验证小数部分
            numeric = scanUnsignInteger(sArray) || numeric
        }
        
        // 如果含e指数,则需验证指数
        if  index < sArray.count && (sArray[index] == "e" || sArray[index] == "E"){
            index += 1
            numeric = numeric && scanInteger(sArray)
        }
        while index < sArray.count && sArray[index] == " "{
            index += 1
        }
        return numeric && (index == sArray.count)
    }
    
    func scanInteger(_ sArray: Array<Character>) -> Bool {
        if index < sArray.count && (sArray[index] == "+" || sArray[index] == "-") {
            index += 1
        }
        return scanUnsignInteger(sArray)
    }
    
    
    func scanUnsignInteger(_ sArray: Array<Character>) -> Bool{
        let before = index
        while index < sArray.count  && sArray[index] >= "0" && sArray[index] <= "9" {
            index += 1
        }
        return index > before
    }
}
上一篇下一篇

猜你喜欢

热点阅读