JZ53 表示数值的字符串
表示数值的字符串
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路:
1、这个题很恶心人,“46.e3”、“3.”、"+.8"等都是数字,而且需要考虑首位的空格字符
2、暴力求解,E后面必为整数(正负整数),偷个懒将该整体使用strconv.Atoi做判断,不满足直接返回false
3、其余部分,所有合法的字符对都只能出现一次,“+”和“-”,“E”和“e”,“.”,使用map将这三个分别用1,2,3做个标记,出现过则将map[i]标记为true,相应字符若再出现直接返回false
4、不考虑E后面的部分,正负号只能出现在第一个字符
5、题目的恶心之处在于“.”可能出现在第一个或最右一个字符处,需要额外判断,但“.”左右字符至少有一个是数字
6、E前必须是数字或“.”
7、弄清楚后写个规则遍历就好
func isNumber(s string) bool { //去掉首尾空格 s = strings.Trim(s," ") if len(s) == 0 { return false } //长度为1则必为数字 if len(s) == 1 { _,e := strconv.Atoi(s) if e != nil { return false } } tmp := make(map[int]bool,3) for k,i := range s{ _,e := strconv.Atoi(string(i)) if string(i)=="+" || string(i)=="-" { // 正负号只能出现在首位 if k == 0 { tmp[1] = true }else{ return false } }else if string(i)=="." { if tmp[2] { return false } //小数点左右必须有一个为数字 if k==0 { _,e := strconv.Atoi(string(s[k+1])) if e != nil { return false } }else if k == len(s)-1{ _,e := strconv.Atoi(string(s[k-1])) if e != nil { return false } }else { _,e2 := strconv.Atoi(string(s[k-1])) _,e3 := strconv.Atoi(string(s[k+1])) if e2 != nil && e3 != nil { return false } } tmp[2] = true }else if string(i) == "E" || string(i) == "e" { if tmp[3] { return false } if k>=len(s)-1 || k<=0 { return false } //e前面必须是数字或".", _,e = strconv.Atoi(string(s[k-1])) if e != nil && string(s[k-1]) != "." { return false } //e后面必须为整数,偷个懒用strconv.Atoi直接判断 _,e = strconv.Atoi(s[k+1:]) if e != nil { return false }else{ break } }else if e != nil{ return false } } return true }