美文网首页
leetcode第七题 Reverse Integer 翻转整数

leetcode第七题 Reverse Integer 翻转整数

作者: 相信灬你一直在 | 来源:发表于2019-02-19 18:42 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:leetcode第七题 Reverse Integer 翻转整数

          本文链接:https://www.haomeiwen.com/subject/saifyqtx.html