給定一個 32 位有符號整數,將每一位的數字反序java
例1:ios
輸入:123
輸出:321
複製代碼
例2:算法
輸入:-123
輸出:-321
複製代碼
例3:bash
輸入:120
輸出:21
複製代碼
注意:spa
假設咱們使用的是 32 位系統,且只能處理 範圍的整數,當出現整型溢出時,你的程序返回 0.net
Easy
3d
首先這道題不適合使用 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。
對於正數,咱們知道其最大值是 ,因此若是結果
在下一次「左移」前大於 214748364,那麼就必定會發生溢出;特殊狀況是
在「左移」前等於 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
中的條件就包含了剛纔說的兩種溢出狀況。