[LeetCode]Reverse Integer

来源:互联网 发布:ubuntu网络配置命令 编辑:程序博客网 时间:2024/06/11 19:26

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的数据类型如下所示:
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;  }}
原创粉丝点击