算法题—整数反转——时间100%空间99.73%

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = 120
输出:21

提示:
-231 <= x <= 231 - 1

解:

总的来说就是:先做不管边界的整数反转,留下最后一步做考虑边界的判断。
一、先看看不考虑整型阈值边界的整数反转的方法
比如原数x ,反转后的数final;
一直做下面的运算,直到x=0就行了。

final = final*10 + x%10;
x /= 10;

比如开始有 final=0 ,x=123;

一次运算后 final=3 ,x=12;

二次运算后 final=32,x=1;

三次运算后 final=321,x=0;

得到反转的finalnum = 321。

二、然后考虑边界

首先说明,整型变量在加到阈值边界之后,再加结果不会再变,假设int值最大是1000,那么1000+1还是1000

这里用到另一个变量secondary_final(nd_final)表示最后一次运算前的final值,比如以上例子的nd_final就是32。

那么,最后一次运算就是final = nd_final*10 + x%10。

只需要判断在最后一步运算中会不会超过阈值边界,首先nd_final肯定是不会超过边界的,然后乘10可能会导致超过边界,再去加最后一位x%10的时候也可能会导致超过边界。

①首先判断乘10会不会超过,就看看nd_final乘10之后再除以10,得到的结果还等不等于nd_final,不等于则会超过。

比如,假设int值最大为1000,nd_final=101;101x10等于1010超过阈值了,所以101x10还是1000,1000除以10得到100,已经不等于原数101了,所以nd_final*10就会超过阈值了,直接返回0;

②然后判断+x%10会不会超过,同理,就看看第一步nd_final乘10的结果+x%10之后再-x%10,看结果还等不等于原数,不等于则会超过。

比如,假设int值最大为1000,nd_final*10=1000,x=1;1000+1=1001超过阈值,所以1000+1还是1000,1000-1=999,已经不等于原数1000了,所以这里就会超过阈值,直接返回0。

若没有超过边界则直接返回final。

(负数也是同样的操作)

 public int reverse(int x) {
        int finalnum=0,nd_final=0;
        while(x/10 != 0){    // 留一位单独算
            nd_final = nd_final*10 + x%10;
            x /= 10;
        }
        finalnum = nd_final;
        nd_final *= 10;             // ①
        if(nd_final/10 != finalnum)
            return 0;
        finalnum = nd_final + x;    //②
        if(finalnum-x != nd_final)
            return 0;
        return finalnum;
    }

时间复杂度:O(N)
空间复杂度:O(1)

你可能感兴趣的:(算法,java,数据结构)