[LeetCode] 7. Reverse Integer 題解

問題描述

給定一個 32 位有符號整數,將每一位的數字反序java

例1:ios

輸入:123
輸出:321
複製代碼

例2:算法

輸入:-123
輸出:-321
複製代碼

例3:bash

輸入:120
輸出:21
複製代碼

注意:spa

假設咱們使用的是 32 位系統,且只能處理 [-2^{31},2^{31}-1] 範圍的整數,當出現整型溢出時,你的程序返回 0.net

問題難度

Easy3d

解題思路

首先這道題不適合使用 Python 來作,緣由是面對負數時,Python 的行爲與指望不符,例如code

>>> -31/10
-3.1
>>> -31%10
9
複製代碼

而使用 C++ 這樣的語言,你會獲得這樣的結果leetcode

int main() {
	cout << "-3 / 10 = " << -3/10 << endl; 
	cout << "-3 % 10 = " << -3%10 << endl; 
}
輸出:
-3 / 10 = 0
-3 % 10 = -3
複製代碼

能夠看到後者比較符合咱們的預期。rem

另外此題的關鍵在於如何解決整數溢出,思路以下:

整數溢出不能在發生了以後纔去判斷,而只能在發生溢出以前判斷,咱們的算法是,將原數不斷除以 10,把獲得的餘數再不斷乘以 10 ,這樣就能夠將原數「反轉」,咱們能夠形象的把除以 10 看做是原數的右移,而把乘以 10 看作是新數的左移;既然要在溢出以前判斷,那麼咱們就須要先將整型的最大值或最小值除以 10,而後將結果和該值進行比較,若是發現進一步操做會發生溢出,則返回 0。

對於正數,咱們知道其最大值是 2^{31}-1=2147483647 ,因此若是結果 y 在下一次「左移」前大於 214748364,那麼就必定會發生溢出;特殊狀況是 y 在「左移」前等於 214748364,此時還須要判斷下一個餘數是否超過 7,若是超過,也能夠判斷其會發生溢出。

同理,負數也能夠這樣進行判斷,這樣咱們就能夠寫出程序了:

#include <iostream>
#include <climits>
using namespace std;

int integer_reverse(long x) {
    int result = 0;
    while (x != 0) {
        int remainder = x % 10;
        x = x / 10;

        if (result > INT_MAX/10 || (result == INT_MAX/10 && remainder > 7)) return 0;
        if (result < INT_MIN/10 || (result == INT_MIN/10 && remainder < -8)) return 0;

        result = result * 10 + remainder;
    }

    return result;
}
複製代碼

能夠看到,兩個 if 語句分別處理正數和負數兩種狀況,而 if 中的條件就包含了剛纔說的兩種溢出狀況。

原題連接

相關文章
相關標籤/搜索