刷题2 -- 整数反转

214 阅读2分钟

一、题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

链接:leetcode-cn.com/problems/re…

二、思路分析

  1. 由题意得,根据%取模操作符和/操作符很容易就得出,对于一个整数的操作 ① 将123 % 10 得到3,再将123 / 10
    ② 将12 % 10 得到2,再将12 / 10
    ③ 将1 % 10 得到1,再将1 / 10
class Solution {
    public int reverse(int x) {
        int target = 0;
        while(x != 0) {
            target = target * 10 + x % 10;
            x /= 10;
        }
        return target;
    }
}
  1. 但是对于这个题目而言,要求我们最大的整数不能超过2147483647,2147483646这个数组翻转过来后,int类型将会产生溢出的情况,所以要考虑排除这种大数的条件。 ① 找出条件 ② 对比这个数是否发生溢出(即与原来进行比较,看看是否发生变化,如果没有变,则说明没有溢出)

三、答案

class Solution {
    public int reverse(int x) {
        int res = 0;
        int last = 0;
        while(x!=0) {
            int tmp = x%10;
            last = res;
            res = res*10 + tmp;
            //判断整数溢出
            if(last != res/10)
            {
                return 0;
            }
            x /= 10;
        }
        return res;
    }
}	
class Solution {
    public int reverse(int x) {
        int res = 0;
        while(x!=0) {
            //每次取末尾数字
            int tmp = x%10;
            //判断是否 大于 最大32位整数
            if (res>214748364 || (res==214748364 && tmp>7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res<-214748364 || (res==-214748364 && tmp<-8)) {
                return 0;
            }
            res = res*10 + tmp;
            x /= 10;
        }
        return res;
    }
}