【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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章