zoukankan      html  css  js  c++  java
  • 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
    }
     
  • 相关阅读:
    【UOJ 121】Hzwer的陨石
    【UOJ 666】古老的显示屏
    【UOJ 222】正方形二分型
    【UOJ 654】虫洞问题
    【UOJ 226】最近公共祖先
    【UOJ 92】有向图的强连通分量
    poj2139 Floyd
    poj1631 dp,最长上升子序列
    poj1065&1548 dp,最长上升子序列,偏序与反偏序
    poj1458(裸LCS)
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14642344.html
Copyright © 2011-2022 走看看