题目

Given a 32-bit signed integer, reverse digits of an integer.

也就是要反转一个数字,比如123变成321、-123变成-321。但是有一个要注意的地方,数字一定要在32位的有符号数字范围内,要是不在范围内的话,返回0

解法

解法1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func reverse(x int) int {
	if x >= math.MaxInt32 || x <= math.MinInt32 {
		return 0
	}

	i := 10
	num := make([]int, 0)
	for {
		rem := x % i
		num = append(num, rem/(i/10))
		if rem == x {
			break
		}
		i *= 10
	}
	result := 0
	for n, v := range num {
		result += v * int(math.Pow(10, float64(len(num)-1-n)))
	}

	if result >= math.MaxInt32 || result <= math.MinInt32 {
		return 0
	}

	return result
}

解法2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func reverse2(x int) int {
	var result int32 = 0
	for x != 0 {
		tail := int32(x) % 10
		newResult := result*10 + tail
		if (newResult-tail)/10 != result { //overflow,因为从数学来考虑,这个等式是肯定相等的。如果不相等,就出现了数字超过范围的情况了
			return 0
		}
		result = newResult
		x /= 10
	}
	return int(result)
}

总结

  • 解法2比解法1少调用一个slice去保存数据
  • 解法2在处理数字超过范围的问题上更简单