/*
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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Validate if a given string is numeric. Some examples:"0" ...