Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
click to show spoilers.
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
绞尽脑汁没有想出来啊,果然是 不做算法不知道自己有多蠢 。。。
查看参考答案后,思路整理如下:
1.考虑如何取出各位数字
这个比较简单,只需要不断的 %10 再 /10 就可以了
e.g. n=123
123%10=3 个位
123/10=12 n=12
12%10=2 十位
12/10=1 n=1
1%10=1百位
1/10=0 n=0 结束循环
2.如何交换个位数字
最低位*10^(位数-1)
次地位*10^(位数-2)
……
最高位*10^0
在实际编程过程中,我们可以先取个位数,再依次向高位取值。每经过一个取值循环,就将已经之前的数*10+新得到的数;
e.g.
先取个位 0*10+3=3
十位 3*10+2=32
百位 32*10+1=321
3.考虑数组溢出的问题
一开始,我觉得你x都已经定义成int类型的了,为什么还会溢出呢?没道理啊。。。
后来发现,原来是数据翻转后可能会溢出。
java的数据类型如下所示:
由于此处算正负号,此处数值范围应该在 -2^31-2^31-1( -2147483648~2147483647 )
如果是1000000009反转后就会溢出了;
需要注意的是,存储翻转后的数不能是int类型的,否则溢出了它会生成一个新数,导致你后面无法判断他是否溢出
如何判断是否溢出
这是一个坑,我们在每一步 之前的数*10+新得到的数 都要判断是否溢出。
别的技术博客都写到了INT_MAX这么一个变量,但是我在API文档中没有找到,eclipse中,此变量也是标红报错,难道是他们默认我们都知道?
此处,我倾向于把最大最小值标出来,而且不采用绝对值判断的方式
最后,把accepted的代码附上,供大家参考
class Solution {
public int reverse(int n) {
int int_max=(int)Math.pow(2,31)-1;
int int_min=-(int)Math.pow(2,31);
long sum=0;
int t=0;
while(n !=0 ){
t=n%10;
sum=sum*10+t;
n=n/10;
if(sum>int_max || sum<int_min){
return 0;
}
}
return (int)sum;
}
}
本文详细解析了一种经典的整数翻转算法,并提供了完整的Java实现。通过实例演示了如何逐位提取并重组数字,同时讨论了32位整数溢出问题及解决方案。
460

被折叠的 条评论
为什么被折叠?



