8. String to Integer (atoi)

题目 #

Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++’s atoi function).

The algorithm for myAtoi(string s) is as follows:

  • Read in and ignore any leading whitespace.
  • Check if the next character (if not already at the end of the string) is ‘-’ or ‘+’. Read this character in if it is either. This determines if the final result is negative or positive respectively. Assume the result is positive if neither is present.
  • Read in next the characters until the next non-digit character or the end of the input is reached. The rest of the string is ignored.
  • Convert these digits into an integer (i.e. “123” -> 123, “0032” -> 32). If no digits were read, then the integer is 0. Change the sign as necessary (from step 2).
  • If the integer is out of the 32-bit signed integer range $[-2^{31}, 2^{31} - 1]$, then clamp the integer so that it remains in the range. Specifically, integers less than $-2^{31}$ should be clamped to $-2^{31}$, and integers greater than $2^{31} - 1$ should be clamped to $2^{31} - 1$.
  • Return the integer as the final result.

Note:

  • Only the space character ’ ’ is considered a whitespace character.
  • Do not ignore any characters other than the leading whitespace or the rest of the string after the digits.

思路1 #

状态机实现,不详细解释

由于没有限制64位,直接用64位判断溢出

 1func myAtoi(s string) int {
 2	var result int64
 3	sign := 1
 4	isParse := false
 5	for _, v := range s {
 6		if v <= '9' && v >= '0' {
 7			if !isParse {
 8				result = int64(v - '0')
 9				isParse = true
10				continue
11			}
12			result *= 10
13			result += int64(v - '0')
14			if sign == 1 && result > math.MaxInt32 {
15				return math.MaxInt32
16			} else if result-1 > math.MaxInt32 {
17				return math.MinInt32
18			}
19			continue
20		} else if isParse {
21			break
22		} else if v == '-' {
23			sign = -1
24			isParse = true
25		} else if v == '+' {
26			isParse = true
27		} else if v != ' ' {
28			return 0
29		}
30	}
31	return int(result) * sign
32}