题目描述
剑指 Offer 20. 表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
数值(按顺序)可以分成以下几个部分:
若干空格 一个 小数 或者 整数 (可选)一个 'e' 或 'E' ,后面跟着一个 整数 若干空格 小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-') 下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 '.' ,后面跟着至少一位数字 整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-') 至少一位数字 部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]
示例 1:
输入:s = "0" 输出:true 示例 2:
输入:s = "e" 输出:false 示例 3:
输入:s = "." 输出:false 示例 4:
输入:s = " .1 " 输出:true
提示:
1 <= s.length <= 20 s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,空格 ' ' 或者点 '.' 。
解题思路
法1
方法1:模拟\
-
特殊规则:
-
e后必须跟数字 -
点前必须跟数字 -
只能有一个点
-
去掉空格 首先使用 strings.TrimSpace 函数去掉字符串两端的空格,然后遍历字符串中的每一个字符,根据题目所述的规则来判断该字符是否属于数值表示的一部分。:
-
模拟数字判断 一个小数或者整数:遍历字符串中的每一个字符,如果该字符是数字,则说明字符串表示了小数或者整数的一部分;否则如果该字符是符号字符(+ 或 -),则需要判断该符号字符是否出现在字符串的第一个位置,或者出现在字符 e 或 E 的后面,如果都不是,则说明字符串不是合法的数值表示。 (可选)一个 'e' 或 'E',后面跟着一个整数:如果字符串中存在 e 或 E,则说明该字符串表示了指数形式的数值,需要特别处理。具体来说,如果字符串中没有数字或者已经存在了 e 或 E,或者 e 或 E 出现在字符串的最后一个位置,则说明字符串不是合法的数值表示;否则可以继续判断后面的整数部分是否合法。 若干空格:同样使用 strings.TrimSpace 函数去掉字符串两端的空格即可。
-
小数:小数表示的规则比较复杂,需要分多种情况讨论。具体来说,如果字符串中已经存在了 e 或 E,则说明小数部分已经结束,不需要再继续判断;否则需要分别考虑以下情况: 第一个字符是符号字符(+ 或 -):如果符号字符出现在第一个位置,则说明该小数是正数或负数;否则如果符号字符出现在小数的中间,则说明该小数不是合法的数值表示。 小数点后面至少有一位数字:如果小数点后面没有数字,则说明该小数不是合法的数值表示。
-
整数:整数表示的规则比较简单
-
符号(+/-)可选 -
数字
总体来说就是小数与幂难求
-
时间复杂度(O(n)) -
空间复杂度(O(n))
执行结果
法1
func isNumber(s string) bool {
s = strings.TrimSpace(s)
if s == "" {
return false
}
hasNum := false//数字匹配规则
hasDot := false//点匹配规则
hasE := false//e匹配规则
for i, c := range s {
if c >= '0' && c <= '9' {
hasNum = true
} else if c == '+' || c == '-' {
if i != 0 && s[i-1] != 'e' && s[i-1] != 'E' {
return false
}
} else if c == 'e' || c == 'E' {
if hasE || !hasNum || i == len(s)-1 {
return false
}
hasE = true
} else if c == '.' {
if hasDot || hasE {
return false
}
hasDot = true
} else {
return false
}
}
if hasE && (!hasNum || s[len(s)-1] == 'e' || s[len(s)-1] == 'E') {
return false
}
return hasNum
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 0 ms , 在所有 Go 提交中击败了 100.00% 的用户 内存消耗: 2 MB , 在所有 Go 提交中击败了 79.17% 的用户 通过测试用例: 1480 / 1480 炫耀一下:
法2
法3
本文由 mdnice 多平台发布