【LeetCode】0007——整数反转

题目描述

在这里插入图片描述

解题思路

  本题定义为简单,那么应该用不到什么高大上的数据结构,其实就是考大家对 %/ 的使用,以及对整数边界的判别。

  • %:取余,例如:11 % 10 = 1,取尾
  • /:除以并取整,例如:11 / 10 = 10,去尾
  • 两个搭配使用,就可以达到将一个数,从后往前依次取出每个数字,正好用于本题
  • 因为整数的最大值为:2147483647,最小值为:-2147483648
  • 如果一个数大于214748364,那么下一步 rev = rev*10+pop 一定越界;或者一个数等于214748364,并且pop > 7,那么下一步 rev = rev*10 + pop也一定越界
  • 如果一个数小于-214748364,那么下一步rev = rev*10+pop 一定越界;或者一个数等于-214748364,并且pop < -7,那么下一步rev = rev*10 + pop也一定越界

Java代码

class Solution {
    public static int reverse(int x) {
        int rev = 0;  //用于存储反转后的数
        while( x != 0){
            int pop = x % 10; //pop表示取出整数的最后一个数
            //因为整数的最大值为:2147483647,最小值为:-2147483648
            //如果一个数大于214748364,那么下一步rev = rev*10 一定越界;
            //或者一个数等于214748364,并且pop > 7,那么下一步rev = rev*10 + pop也一定越界
            //如果一个数小于-214748364,那么下一步rev = rev*10 一定越界;
            //或者一个数等于-214748364,并且pop < -7,那么下一步rev = rev*10 + pop也一定越界
            if((rev > Integer.MAX_VALUE / 10||(rev == Integer.MAX_VALUE/10 && pop > 7))
               ||rev < Integer.MIN_VALUE / 10||(rev == Integer.MIN_VALUE/10 && pop <-8)){
                return 0;
            }
            rev = rev*10 + pop; //把pop防到rev后面
            x /= 10; //去掉整数的最后一个数,继续遍历
        }
        return rev;
    }
}

Python3代码

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        num = 0
        if x == 0:
            return 0
        if x < 0:
            x = -x
            while x != 0:
                num = num * 10 + x % 10
                x = x // 10
            num = -num
        else:
            while x != 0:
                num = num * 10 + x % 10
                x = x // 10
            
        if num > pow(2,31)-1 or num < pow(-2,31):
            return 0
        return num

注意:
11 % 10 = 1,-11 % 10 = 9
11 // 10 = 1, -11 // 10 = -2
11 / 10 = 1.1,-11 / 10 =-1.1
python对正数和负数的结果不一样,我们应该将负数转为正数再操作

C++代码

class Solution {
public:
    int reverse(int x) {
        int rev = 0;  //用于存储反转后的数
        while( x != 0){
            int pop = x % 10; //pop表示取出整数的最后一个数
            //因为整数的最大值为:2147483647,最小值为:-2147483648
            //如果一个数大于214748364,那么下一步rev = rev*10 一定越界;
            //或者一个数等于214748364,并且pop > 7,那么下一步rev = rev*10 + pop也一定越界
            //如果一个数小于-214748364,那么下一步rev = rev*10 一定越界;
            //或者一个数等于-214748364,并且pop < -7,那么下一步rev = rev*10 + pop也一定越界
            if((rev > INT_MAX / 10||(rev == INT_MAX/10 && pop > 7))
               ||rev < INT_MIN / 10||(rev == INT_MIN && pop <-8)){
                return 0;
            }
            rev = rev*10 + pop; //把pop防到rev后面
            x /= 10; //去掉整数的最后一个数,继续遍历
        }
        return rev;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章