首页 > 技术文章 > JZ20 表示数值的字符串

heyour 2022-03-13 16:24 原文

题目:见牛客网 JZ20 表示数值的字符串

巧妙的解法,总是能让人欢欣鼓舞,太赞了!

参考:tengzbiao大佬的 (下面为Go语言版本)

package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @return bool布尔型
*/
// 参考 tengzbiao
import (
    "strings"
)

func isNumeric( str string ) bool {
    str = strings.TrimSpace(str)
    if str == "0" { return true }
    
    idx, n := 0, len(str)
    
    isUnsignerNumber := func() bool {
        tmp := idx
        for idx<n && str[idx]>='0' && str[idx] <= '9' { idx++ }
        return idx > tmp // 这部分至少存在一个数字
    }
    isNumber := func() bool { // 就是为了去掉正负号
        if idx<n && (str[idx]=='+' || str[idx]=='-') { idx++ }
        return isUnsignerNumber()
    }
    
    fg1, fg2 := isNumber(), false // 默认第二部分为空,如整数时
    // 小数的情况
    if idx<n && str[idx]=='.' {  // 小数点后半部分是否合理
        idx++
        fg2 = isUnsignerNumber()
    }
    // 科学计数时
    if idx<n && (str[idx]=='e' || str[idx]=='E') {
        idx++
        if !isNumber() { return false }
    }

    return idx==n && (fg1 || fg2)
}

推荐阅读