1. 程式人生 > >LeetCode 7: Reverse Integer

LeetCode 7: Reverse Integer

its 空間復雜度 時間 是否 min 最大數 light sed 輸出

Description:

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: [?231

, 231 ? 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比特數據可以保存的數字的範圍為[-232, 232-1],當數字溢出時,返回0。

方法:

該方法的技巧之處在於如何檢測數字溢出。

采用數學的方法實現數字的反轉。

簡述如下:

pop = x % 10
x = x / 10

temp = temp * 10 + pop

假設數字x為正值,判斷轉換後的數字是否溢出的條件如下:

1. 如果temp = temp * 10 + pop造成溢出,那麽運算前temp的值temp >= INT_MAX/10
2. 如果temp > INT_MAX/10,那麽temp = temp * 10 + pop一定溢出
3. 如果temp == INT_MAX/10,並且pop > 7,那麽temp = temp * 10 + pop溢出。

這裏,對於條件3,pop > 7的是因為32位整形表示的最大數字為2147483647。

相應地,對於負數,也做類似處理。

class Solution {
public:
    int reverse(int x) {
        int ret = 0;
        while(x) {
            int pop = x % 10;
            x = x / 10;
            if(ret > INT_MAX / 10 || (ret == INT_MAX / 10 && pop > 7))
                return 0;
            if(ret < INT_MIN / 10 || (ret == INT_MIN / 10 && pop < -8))
                return 0;
            ret = ret * 10 + pop;
        }
        
        return ret;
    }
};

時間復雜度為O(lg(x)),空間復雜度為O(1)。

LeetCode 7: Reverse Integer