题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
链接
https://leetcode-cn.com/problems/reverse-integer/
运行环境
java语言
思路
原谅我没有看到溢出错误这里,我只看到反转就直接动手了。
反转这一块的思路就是先把数按照个十百千这种顺序拿出来,怎么拿出来呢?我记得我最开始学C语言的时候就遇到这种需要一位一位拿出来的题,就是用除法和取余,两个交替使用就能得到每一位,%10就能得到个位,再把原来的数去/10就能减少一位,再取余又得到百位,以此类推,一直到取余之后得到0,说明以及到达最高位了。每一位拿出来后怎么办呢?我们发现个位变成了最高位,但是最高位到底是几位呢?总不能去算几位吧,这样用的时间就太长了,以最高位为例,每次除以10之后都少了一位,这是我们让最低位乘10,那么当最高位变成最低位的时候,最低位也就变成了最高位。所以可以用下面的代码来实现
代码1(错误)
class Solution {
public int reverse(int x) {
int temp=0;
while(x!=0){
temp=temp*10+x%10;
x/=10;
}
return temp;
}
}
结果怎么样呢?结果当然是错误的。不是分析有错误,是因为没有考虑到溢出的问题。2^31-1=2147483647,如果给我们的就是这个数怎么办,反转之后变成7463847421吗?不是,因为这个时候已经超出了int的范围了,已经溢出了,所以不会给出正确答案。看下面的补充思路。
补充思路
如果已经溢出了,那么int肯定装不下了,所以改用long来装反转后的数,然后再来判断有没有超出int的范围,如果溢出了,就返回0,否则就强制类型转换为int型返回。在Integer包装类中提供了两个静态常量值作为int的最小范围以及最大范围,分别为MIN_VALUE和MAX_VALUE。
代码2
class Solution {
public int reverse(int x) {
long temp=0;
while(x!=0){
temp=temp*10+x%10;
x/=10;
}
if(temp<Integer.MIN_VALUE || temp>Integer.MAX_VALUE)
return 0;
return (int)temp;
}
}