题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入:123
返回:321
示例 2:
输入:-123
输出:-321
示例 3:
输入:120
输出:21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:
一开始,我想着把整数变成字符串来处理,然后去反转字符串,但我在实现过程中发现这并不是个好办法。
如果我们先不考虑溢出的问题,那么这个题目将变成一个简单的数学题,假设输入数为
123456
,可以使用123456%10
方法得到末尾数6
,然后做一次123456/10
运算,把末尾数去掉得到余下位数12345
,再故技重施依次得到5
,4
,3
,2
,1
,再按这个顺序依次进行反转运算拼接,即可完成反转,并且这个方法对负数同样适用。现在我们考虑溢出的问题,就需要在每一次反转拼接后就做一次判断,是否已经溢出。
若一个进行反转拼接的数已经大于214748364
(9位数)则无需再进行取最后一位的拼接了,因为最大值为2147483647
(10位数),无论最后一位拼接什么数都是溢出的,返回0即可,若此时判断的反转拼接数恰好为214748364
则需要判断最后一位拼接数是否大于7
若大于则溢出返回0,小于则拼接后返回。
同理,若一个进行反转拼接的数小于-214748364
(9位数)则无需再进行最后一位的拼接,因为最小值为-2147483648
(10位数),无论最后拼接什么数都会溢出,返回0即可,若此时判断的数恰好为-214748364
(9位数)则需要判断最后一位拼接数是否小于-8
,若小于则溢出返回0,大于则拼接后返回。
代码实现
class Solution {
public int reverse(int x) {
int res = 0;
while (x !=0 ){
//取末尾数
int unit = x%10;
//判断是否大于最大值溢出
if (res > 214748364 || (res == 214748364 && unit > 7))
return 0;
//判断是否小于最小值溢出
if (res < -214748364 || (res == -214748364 && unit < -8))
return 0;
//反转拼接
res = res*10 + unit;
//去掉末尾位
x /= 10;
}
return res;
}
}