7. 整数反转
2022-04-28 本文已影响0人
Sun东辉
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
解题思路:这道题本身不难,具体实现如下,这里特别需要注意的是“如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0”。
func reverse(x int) int {
n := 0
for x != 0 {
n = n*10 + x%10
x /= 10
}
if n > 1<<31 - 1 || n < -1<<31 {
return 0
}
return n
}
实现过程非常简单,清晰,但这里,其实忽略了三个问题:
- 正数和负数的求余过程是一样的吗?哪个更好一些?
- 当 x ≠ 0 时,是不是做多了一次循环?
- 在最终结果被计算出来之前,是否就会超出 32 位有符号整数的范围?
这里其实有着动态规划的考虑,经过优化之后的代码如下:
func reverse(x int) int {
signMultiplier := 1
if x < 0 {
signMultiplier = -1
x = signMultiplier * x
}
var result int
for x > 0 {
result = result*10 + x%10
if signMultiplier*result >= math.MaxInt32 || signMultiplier*result <= math.MinInt32 {
return 0
}
x /= 10
}
return signMultiplier * result
}
最后,欢迎大家留言讨论。