leetcode第七题 Reverse Integer 翻转整数

2019-02-19  本文已影响0人  相信灬你一直在

Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321

Example 2:
Input: -123
Output: -321

Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321

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

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

注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
本题目的目的是翻转整数,此时我们需要考虑的就是翻转前后的数据是否会超出范围。

反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” xxx 的最后一位数字,并将它“推入”到 rev\text{rev}rev 的后面。最后,rev\text{rev}rev 将与 xxx 相反。要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。

//pop operation:
pop = x % 10;
x /= 10;

//push operation:
temp = rev * 10 + pop;
rev = temp;

但是,这种方法很危险,因为当 temp = rev * 10 + pop时会导致溢出。
因此我们需要在这之前写一下检测语句。
int的范围-2147483648~2147483647
因此分为以下三种情况:
1.如果temp=rev*10+pop溢出了,那么一定有rev>=INTEGER/10
2.如果rev>Integer/10必定溢出
3.如果rev=integer/10,那么只要pop>7,也是必定溢出
根据上述条件我们编写如下的代码:

class Solution {
    public int reverse(int x) {
        int rev=0;
        while(x!=0){
            int pop=x%10;
            x/=10;
            if(rev>Integer.MAX_VALUE/10 || (rev==Integer.MAX_VALUE && pop>7)){
                return 0;
            }if(rev<Integer.MIN_VALUE/10 || (rev==Integer.MIN_VALUE && pop<-8)){
                return 0;
            }
            rev=rev*10+pop;
        }
                return rev;
    }
}
上一篇下一篇

猜你喜欢

热点阅读