123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package main
- import (
- "fmt"
- "math"
- "strings"
- )
- func myAtoi(str string) int {
- str = strings.Trim(str, " ")
- if len(str) == 0 {
- return 0
- }
- chars := []rune(str)
- beg, end := 0, 0
- isNegative := false
- // judge the sign of the integer
- switch chars[beg] {
- case '-':
- isNegative = true
- fallthrough
- case '+':
- beg, end = 1, 1
- // deal with "+" or "-"
- if len(str) == 1 {
- return 0
- }
- default:
- beg, end = 0, 0
- }
- // find the first non-zero digit and the last valid digit
- for ; end <= len(chars); end++ {
- if chars[beg] == '0' {
- beg++
- // for str like "000000000000", return 0
- if beg == len(chars) {
- return 0
- }
- continue
- }
- if end == len(chars) || chars[end] < '0' || '9' < chars[end] {
- break
- }
- }
- if beg == end {
- // no valid digit
- return 0
- } else if end-beg > 10 { // overflow (MaxInt32 & MinInt32 have 10 digits only)
- if isNegative {
- return math.MinInt32
- }
- return math.MaxInt32
- }
- sum, base := int64(0), int64(1)
- for ; end > beg; end-- {
- num := int64(chars[end-1] - '0')
- sum += num * base
- base *= int64(10)
- }
- if isNegative {
- sum *= int64(-1)
- }
- if sum < math.MinInt32 {
- return math.MinInt32
- } else if sum > math.MaxInt32 {
- return math.MaxInt32
- }
- return int(sum)
- }
- func testMyAtoi(str string) {
- fmt.Printf("\"%s\" -> %d\n", str, myAtoi(str))
- }
- /* func main() {
- testMyAtoi("")
- testMyAtoi(" 00000000000000000000 ")
- testMyAtoi("+")
- testMyAtoi(" -0.1 ")
- testMyAtoi(" +1.1 ")
- testMyAtoi(" 234.1 ")
- testMyAtoi("42")
- testMyAtoi("9223372036854775808")
- testMyAtoi(" -2.1 ")
- testMyAtoi(" - 0.1 ")
- testMyAtoi(" num 0.1 ")
- } */
|