給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為[−2
31,231
−1][-2^,2^-1]
[−231,
231−
1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
流程如下:
(1)判斷正負
(2)對10取餘,得到餘數,再將整數除10
(3)如此反覆直到(2)中除10後的數為0,演算法停止
(4)將得到的結果返回
一道很簡單的題目,一開始我以為是這樣,但是後來發現,有部分資料通不過測試,經檢查,發現演算法本身沒有問題,但是由於int型別存放範圍是:[−2
31,231
−1][-2^,2^-1]
[−231,
231−
1],所以有部分資料可能超過這個範圍
例如,輸入:1534236469
輸入:-2147483648
輸入:-1563847412
這幾個資料都超了,於是我打算設計乙個閾值:
if (x_reverse != -pow(2, 31))
return x_reverse;
else
return 0;
我當時認為所有超過−231
-2^−2
31表示的數,相加起來應該還是−231
-2^−2
31,因為它不能超過表示的上限。
但是這個想法是錯的,有個測試通過不了,後來回憶了一下計算機加法,實際上,計算機是直接採用補碼來表示數字的,對數字的運算也是直接使用補碼運算,得到的結果根據有符號數與無符號數的型別,來進行解釋,得出不同的結果
我們知道大多數的計算機使用相同的機器指令來執行無符號或者有符號加法。
設:− 2w
−1≤x
≤2w−
1−1-2^\leq x\leq2^-1
−2w−1≤
x≤2w
−1−1
和− 2w
−1≤y
≤2w−
1−1-2^\leq y\leq2^-1
−2w−1≤
y≤2w
−1−1
則:− 2w
≤x+y
≤2w−
2-2^\leq x+y\leq2^-2
−2w≤x+
y≤2w
−2,設z =x
+yz=x+y
z=x+y
此時可能會產生正溢位(2w−
1≤z2^\leq z
2w−1≤z
)或負溢位(z
w−1z< -2^
zw−1)
對於正溢位:令z=z
−2wz=z-2^
z=z−2w
對於負溢位:令z=z
+2wz=z+2^
z=z+2w
這道題的難點應該在於如何判斷是否發生了溢位
(1)出錯1:
我以為只需要判斷兩個數翻轉前後符號是否改變就能確定:有沒有發生溢位
這是受兩數相加,判定溢位的方法啟發得到的,但是在這裡行不通,因為這裡的溢位不是由於相加產生的,而是相乘產生的
因此,我嘗試改進一下,通過設定條件,使得相乘不會產生溢位,再使用這個方法判斷溢位情況。
(2)出錯2
x_reverse += nums[j++] * int(pow(10, i - 1));
**裡的pow必須加上int,因為函式pow返回的數是double型別的,根據c++語法,會自動地將x_reverse從int型別轉為double型別,於是之前的假設就無法成立了,此時不會發生溢位,根據這個特性,可以寫出另乙個判定溢位的方法
c++**如下:
class solution
for (; i > 0; i--)
else
} return x_reverse;
}};
執行效率:
效率不高,還能改進
直接採用long long型別資料來存放反轉後的結果,這樣就不會出現溢位的現象,對反轉後的結果進行判定:
(1)若結果大於32位有符號數能表示的範圍,直接返回0
(2)若結果小於32位有符號數能表示的範圍,直接返回0
因為返回資料型別是int,所以需要在最後強制轉換
c++**:
class solution
if (nums.size() == 10 && (nums[0] > 2 || nums[0] < -2))
return 0;
i = i - 1;
while(i >= 0)
x_reverse += nums[j++] * int(pow(10, i--));
if (x_reverse > int32_max || x_reverse < int32_min)
return 0;
else
return int(x_reverse);
}};
執行效率:
????為什麼變低了?這可能是因為取消了很多特殊判定。
LeetCode7反轉整數
給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123輸出 321示例 2 輸入 123輸出 321示例 3 輸入 120輸出 21注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。以字串方式思考...
LeetCode 7 反轉整數
給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123輸出 321示例 2 輸入 123輸出 321示例 3 輸入 120輸出 21注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返回 0。很簡單,就是不...
leetcode 7反轉整數
隨機一題 給定乙個 32 位有符號整數,將整數中的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 231,231 1 根據這個假設,如果反轉後的整數溢位,則返...