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
}

 

 

 
posted @ 2021-04-10 22:12  zqlucky  阅读(91)  评论(0编辑  收藏  举报