mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-08 02:15:01 +08:00
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
package leetcode
|
|
|
|
func myAtoi(s string) int {
|
|
maxInt, signAllowed, whitespaceAllowed, sign, digits := int64(2<<30), true, true, 1, []int{}
|
|
for _, c := range s {
|
|
if c == ' ' && whitespaceAllowed {
|
|
continue
|
|
}
|
|
if signAllowed {
|
|
if c == '+' {
|
|
signAllowed = false
|
|
whitespaceAllowed = false
|
|
continue
|
|
} else if c == '-' {
|
|
sign = -1
|
|
signAllowed = false
|
|
whitespaceAllowed = false
|
|
continue
|
|
}
|
|
}
|
|
if c < '0' || c > '9' {
|
|
break
|
|
}
|
|
whitespaceAllowed, signAllowed = false, false
|
|
digits = append(digits, int(c-48))
|
|
}
|
|
var num, place int64
|
|
place, num = 1, 0
|
|
lastLeading0Index := -1
|
|
for i, d := range digits {
|
|
if d == 0 {
|
|
lastLeading0Index = i
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
if lastLeading0Index > -1 {
|
|
digits = digits[lastLeading0Index+1:]
|
|
}
|
|
var rtnMax int64
|
|
if sign > 0 {
|
|
rtnMax = maxInt - 1
|
|
} else {
|
|
rtnMax = maxInt
|
|
}
|
|
digitsCount := len(digits)
|
|
for i := digitsCount - 1; i >= 0; i-- {
|
|
num += int64(digits[i]) * place
|
|
place *= 10
|
|
if digitsCount-i > 10 || num > rtnMax {
|
|
return int(int64(sign) * rtnMax)
|
|
}
|
|
}
|
|
num *= int64(sign)
|
|
return int(num)
|
|
}
|