简言
纯记录,不建议读者观看我的代码(法一),单纯为了熟悉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 位整数并返回。