leetcode刷题笔记六十五 有效数字
源地址:65. 有效数字
问题描述:
验证给定的字符串是否可以解释为十进制数字。
例如:
"0" => true
" 0.1 " => true
"abc" => false
"1 a" => false
"2e10" => true
" -90e3 " => true
" 1e" => false
"e3" => false
" 6e-1" => true
" 99e2.5 " => false
"53.5e93" => true
" --6 " => false
"-+3" => false
"95a54e53" => false说明: 我们有意将问题陈述地比较模糊。在实现代码之前,你应当事先思考所有可能的情况。这里给出一份可能存在于有效十进制数字中的字符列表:
数字 0-9
指数 - "e"
正/负号 - "+"/"-"
小数点 - "."
当然,在输入中,这些字符的上下文也很重要。
代码补充:
/**
本题较为繁杂,主要是针对错误选项要进行一一排查
*/
object Solution {
def isNumber(s: String): Boolean = {
s match {
//排除空格及空字符串
case s if Option(s) == None => false
case s if s.trim.length == 0 => false
//判断字符串具体情况
case s => {
//将字符串左右侧的空格去除
val str = s.trim
/**
digit : 标记目前已检索数字情况
dot : 标记目前已检索小数点情况
sign : 标记目前已检索符号情况
e : 标记目前已检索指数情况
*/
var digit = false
var dot = false
var sign = false
var e = false
for(c <- str){
//空串
if(c == ' ') return false
//排除"*E*E" 及 E之前底数
if(c == 'e' && (e == true || digit == false)) return false
//排除".*."及"e*."
if(c == '.' && (dot == true || e == true)) return false
//排除"+|-"出现在
if((c == '+' || c == '-') && (sign == true || digit == true || dot == true)) return false
//出现数字 认为已放置数字
if(c >= '0' && c <= '9') digit = true
//出现符号,认为已放置符号
else if (c == '+' || c == '-') sign = true
//出现小数点,认为已放置小数点
else if (c == '.') dot = true
//底数确定,判断指数
else if (c == 'e') {
e = true
digit = false
dot = false
sign = false
}
else return false
}
//底数确定,指数错误
if (e == true && digit == false) return false
return digit
}
}
}
}