一、原题
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
二、心得
这题很有趣~~~且听我道来(●'◡'●)
这道题不是很难,核心思想就是将 x 不断地取末尾的数字出来,放入新的数的首部,仅用基本逻辑运算即可解出正确解,具体结果如下:
class Solution {
public int reverse(int x) {
int y = 0;
while(x != 0){
if(y < -2147483648 / 10 || y > 2147483647 / 10){
return 0;
}
int temp = x % 10;
y = y * 10 + temp;
x = x / 10;
}
return y;
}
}
如果不能很好的看懂,下面这张图可以有助于你理解(举个例子):
起始:x = 123456 | 目标:y = 654321 | 起始:y = 0 | ||||
temp = x % 10 | x = x / 10 | y = y * 10 + temp | ||||
第一次 | 6 | 12345 | 6 | |||
第二次 | 5 | 1234 | 65 | |||
第三次 | 4 | 123 | 654 | |||
第四次 | 3 | 12 | 6543 | |||
第五次 | 2 | 1 | 65432 | |||
第六次 | 1 | 0 | 654321 | |||
终止循环条件 |
这道题有趣就有趣在如下代码:
if(y < -2147483648 / 10 || y > 2147483647 / 10){
return 0;
}
起初我先用的是 y < -2147483648 || y > 2147483647 ,但测试的结果会报错。原因在于,此时得到的反转数 y 是经过 x 最后一次取模和取商后的结果,即 x / 10 = 0 ,跳出了 while 循环,返回了一个不符合(超出范围的)y 值,如何判断 y 是否超范围?只需要如上代码所示即可。原因是,此时的 y (已超范围)再经过 y = y * 10 + temp; 时,必定会超出给定的范围,只需此时能够返回该不符合范围的情况,进而避免了未检测 y 是否超出范围而跳出了循环的情况。由此可见,代码的执行顺序尤其重要!!!
你是否想问当 x < 0 的情况该代码是否满足?可以明确地告诉你,此算法具有同号性,即输入的 x 是什么符号,返回的 y 就是什么符号。你不信?简单拿个负数推演一下(●ˇ∀ˇ●)(我就不演示了哈)~