leetcode-整数反转

110 阅读2分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

第7天,继续挑战第7题。这题在别的OJ上都有,归类可能是water。也没什么弯弯绕绕,直接10进制按位反过来就好。唯一需要注意的一点是大小超限。

题目

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

示例 1:
输入:x = 123
输出:321

示例 2:
输入:x = -123
输出:-321

示例 3:
输入:x = 120
输出:21

示例 4:
输入:x = 0
输出:0

思路

取余得到当前低位数,然后放在答案的高位中。可以用一个中间结果,因为直接放在最高位中需要判断总共有几位,通过辗转乘以10,不停把余数放入中间结果的最低位中,这样随着每一次乘以10,这一位就被一次次推高。判断是否超限这里,参考了网上一些同学的做法后,还是觉得这种最好:中间结果除以10不等于上一个中间结果,那就是溢出了。因为超限之后,数值的正负会被反转,肯定不会是等于上一个中间结果。当然另外还有1种思路是用char数组存然后反过来,那有以下几个注意点:1、正负;2、前导0;3、同样需要考虑超限的问题。

Java版本代码

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            int last = x % 10;
            int result = ans * 10 + last;
            // 这一步用来判断是否溢出,比较巧妙
            if (result / 10 != ans) {
                return 0;
            }
            ans = result;
            x = x / 10;
        }
        return ans;
    }
}