7. Reverse Integer

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

我的解法:

public class Solution {
    public int reverse(int x) {
        long res = 0;
        while(x!=0){
            res = res*10+x%10;
            x = x/10;
        }
        return res>Integer.MAX_VALUE || res

提交后在discuss发现

public int reverse(int x)
{
    int result = 0;

    while (x != 0)
    {
        int tail = x % 10;
        int newResult = result * 10 + tail;
        if ((newResult - tail) / 10 != result)
        { return 0; }
        result = newResult;
        x = x / 10;
    }

    return result;
}

这里最牛逼的一句话是这句判断
if ((newResult - tail) / 10 != result)
以我的思路来看这句本身就会报越界的错误,于是我进行了以下实验:

int a = 9000000001;//这句直接报错 integer number too large
int b = 900000000*10+1
System.out.println(b);//输出410065409

这就很神奇,下边的不报错。然后我网上查了下。
初步学习到原因是int*int越界时java进行默认的类型提升(type promotion),算出结果后发现int b存不下,就又进行了Java的基础类型的变窄转换(Narrowing primitive conversion)规则,把结果宽于int类型宽度的部分全部丢弃,也就是只取结果的低32位,于是就得到了上面的结果。参考地址
我仿照上文做了如下实验:

        int i3 = 1000000;
        System.out.println (Long.toHexString (i3*i3).toUpperCase());
        System.out.println (Double.toHexString (i3*i3).toUpperCase());
        System.out.println (Integer.toHexString (i3*i3).toUpperCase());
        System.out.println ((int)i3*i3);
//        输出结果:
//        FFFFFFFFD4A51000
//        -0X1.5AD78P29
//        D4A51000
//        -727379968

我对于什么叫取低32位还不是很理解,也就是int*int越界后操作还不是很理解,有待继续学习!

你可能感兴趣的:(7. Reverse Integer)