剑指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,按顺序判断是否包含这三部分。
- 在字符串后添加结束标志
- 使用全局index遍历字符串
- scanInteger扫描有符号整数,用来匹配A和C部分
- scanUnsignedInteger扫描无符号整数,用来匹配B部分
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
}
}