算法原链接
https://leetcode-cn.com/problems/string-to-integer-atoi/
解法
package main
import (
"fmt"
"math"
"regexp"
"strconv"
"strings"
)
func main() {
str := "9223372036854775808"
//ii := 922337203685477580
//fmt.Println(ii * 10 + 8)
//i := myAtoi(str)
//fmt.Println(i)
i := myAtoi1(str)
fmt.Println(i)
}
// 自己的解法,耗时很短,但是相对占内存一些
func myAtoi(s string) int {
reg := regexp.MustCompile(`^\s*[+-]?\d*`)
result := reg.FindString(s)
result = strings.Trim(result, " ")
if len(result) == 0 {
return 0
}
num, _ := strconv.Atoi(result)
if num > math.MaxInt32 {
return math.MaxInt32
}
if num < math.MinInt32 {
return math.MinInt32
}
return num
}
// 这个解法参考了官方的自动机解法思路
// 纯操作数字会导致数字溢出变成负数,所以用字符串拼接的方式再转数字
func myAtoi1(s string) int {
var i int
//var flag = 1
// start signed in_number end
state := "start"
str := ""
for _, ch1 := range s {
if state == "start" && ch1 == 32 {
continue
} else if state == "start" && (ch1 == 45 || ch1 == 43) {
state = "signed"
if ch1 == 45 {
str = "-"
}
//else {
// flag = 1
//}
} else if state != "end" && ch1 >= 48 && ch1 <= 57 {
state = "in_number"
//c1, _ := strconv.Atoi(string(ch1))
//i = i*10 + c1
str += string(ch1)
} else {
state = "end"
break
}
}
//i *= flag
i, _ = strconv.Atoi(str)
if i > math.MaxInt32 {
return math.MaxInt32
}
if i < math.MinInt32 {
return math.MinInt32
}
return i
}