整数反转

整数反转

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231,231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

解题思路

在不借助额外的存储结构的情况下,可以使用数学的方式进行反转:

  • 第一步,执行 x%10 可以得到 x 的最后一位数字,也就是我们所得结果的第一位数字;
  • 第二步,执行 x=x/10,由于 x 自身是 int 类型,运算完成之后,实际上是等同于将 x 的最后一位舍弃,即对 x 除法取整处理;
  • 第三步,执行 result = result * 10 + pop 就可以将每一位的数字进行反转。
    由于需要考虑超出 32 位时溢出的情况,那么,result = result * 10 + pop 在什么情况下溢出呢?result 为正值的情况下,如果 result 大于 Integer.MAX_VALUE / 10,那么就一定会溢出,如果 result 等于 Integer.MAX_VALUE / 10,那么,pop 如果大于 Integer.MAX_VALUE % 10也会产生溢出的情况。相反的,如果 result 为负值,也是一样的原理:
 public static int reverse(int x) {
        int result = 0;

        while (x != 0) {
            // x % 10 可以取到 x 最后一位的值,即此时 pop 是 x 的最后一位,也就是新值的第一位
            int pop = x % 10;
            // x 的位数少了最后一位
            x = x / 10;

            // 由于后续运算 result = result * 10 + pop
            // 如果 result 的值大于 Integer.MAX_VALUE / 10 ,那么一定会溢出
            // 如果 result 的值等于 Integer.MAX_VALUE / 10,那么 pop 的值如果大于 Integer.MAX_VALUE % 10 也会溢出
            // 相反的,result 的值小于 Integer.MIN_VALUE / 10 ,那么一定会溢出
            // 如果 result 的值等于 Integer.MIN_VALUE / 10,那么 pop 的值如果小于于 Integer.MIN_VALUE % 10 也会溢出

            if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && pop > Integer.MAX_VALUE % 10)) {
                result = 0;
                return result;
            } else if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && pop < Integer.MIN_VALUE % 10)) {
                result = 0;
                return result;
            }

            result = result * 10 + pop;
        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值