leetcode67(Go语言)

简言

纯记录,不建议读者观看我的代码(法一),单纯为了熟悉Go语言和正则表达式(我纯fw QAQ )。这题明显直接判断string更好判断。

如果想看正则表达式的结果,可以查看法三,是gpt的结果。

正常解法是法二,也是gpt的结果。

法一(正则表达式,请忽略,查看法三)

func strToInt(str string) int {
    if str == "" {
		return 0
	}

	compile1 := regexp.MustCompile(` *([^\s]+)`)
	compile1StrGroup := compile1.FindStringSubmatch(str)

	if len(compile1StrGroup) == 0 {
		return 0
	}

	//fmt.Println(compile1StrGroup)

	if compile1StrGroup[1][0] != '+' && compile1StrGroup[1][0] != '-' {
		if compile1StrGroup[1][0] < '0' || compile1StrGroup[1][0] > '9' {
			return 0
		}
	}

	re := regexp.MustCompile(`^([+-])?(0*)(\d+)`)
	result := re.FindStringSubmatch(compile1StrGroup[1])

	var output int
	var flag bool

	if len(result) == 0 {
		return 0
	}

	//fmt.Println(result, compile1StrGroup[1])

	if result[1] == "-" {
		flag = true
	}

	if len(result[len(result)-1]) > 12 {
		if flag {
			return math.MinInt32
		} else {
			return math.MaxInt32
		}
	}

	for i := 0; i < len(result[len(result)-1]); i++ {
		output = output*10 + (int)(result[len(result)-1][i]-'0')
	}

	if flag {
		output = 0 - output
	}

	if output > int(^uint32(0)>>1) {
		return int(^uint32(0) >> 1)
	} else if output < ^(int(^uint32(0) >> 1)) {
		return ^(int(^uint32(0) >> 1))
	}
	return output
}

法二(正常解法)

func strToInt(str string) int {
    str = strings.TrimSpace(str)
    if len(str) == 0 {
        return 0
    }

    sign := 1
    start := 0
    if str[0] == '-' {
        sign = -1
        start = 1
    } else if str[0] == '+' {
        start = 1
    }

    res := 0
    for i := start; i < len(str); i++ {
        if str[i] < '0' || str[i] > '9' {
            break
        }
        digit := int(str[i] - '0')
        if res > (math.MaxInt32-digit)/10 {
            if sign == -1 {
                return math.MinInt32
            }
            return math.MaxInt32
        }
        res = res*10 + digit
    }
    return sign * res
}

法三(正则表达式)

import (
    "regexp"
    "math"
    "strconv"
)

func strToInt(str string) int {
    re := regexp.MustCompile(`^[\+\-]?\d+`)
    numStr := re.FindString(str)
    if numStr == "" {
        return 0
    }
    
    num, err := strconv.ParseInt(numStr, 10, 64)
    if err != nil {
        if numStr[0] == '-' {
            return math.MinInt32
        }
        return math.MaxInt32
    }
    
    if num < math.MinInt32 {
        return math.MinInt32
    } else if num > math.MaxInt32 {
        return math.MaxInt32
    }
    
    return int(num)
}

思路
[1] 用 re.FindString 方法在输入字符串中查找第一个匹配项。如果没有匹配的数字,函数返回 0。
[2] 用 strconv.ParseInt 函数尝试将数字字符串转换为一个 64 位的整数。如果转换过程中发生溢出,返回 math.MinInt32 或 math.MaxInt32。如果没有发生溢出,将 64 位整数转换为 32 位整数并返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值