算法原链接
https://leetcode-cn.com/problems/string-to-integer-atoi/
解法
package mainimport ("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 endstate := "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 + c1str += string(ch1)} else {state = "end"break}}//i *= flagi, _ = strconv.Atoi(str)if i > math.MaxInt32 {return math.MaxInt32}if i < math.MinInt32 {return math.MinInt32}return i}
