1. 程式人生 > 其它 >python 整數反轉 詳解

python 整數反轉 詳解

"""
給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉後的結果。

如果反轉後整數超過 32 位的有符號整數的範圍 [ - 2 ^ 31 , 2 ^ 31 - 1 ] ,就返回 0。

假設環境不允許儲存 64 位整數(有符號或無符號)。

示例 1:
輸入:x = 123
輸出:321

示例 2:
輸入:x = -123
輸出:-321

示例 3:
輸入:x = 120
輸出:21

示例 4:
輸入:x = 0
輸出:0

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/reverse-integer
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
"""


def reverse(self, x: int) -> int:
# res 為取絕對值
y, res = abs(x), 0
# 其數值範圍為 [−2^31, 2^31 − 1]
# 利用左移右移來表示 2 的 x 次方
# 例如 a << x 表示 a * 2 ^ x
# 因為y取的是絕對值 固取值範圍也只考慮整數的情況
# 下面是一個if else 的簡寫法,展開如下
# if x > 0:
# boundry = (1 << 31) - 1 -->負數情況
# else:
# boundry = 1 << 31 -->正數情況
boundry = (1 << 31) - 1 if x > 0 else 1 << 31
# 用迴圈的方式來確定是否還有值,只要有值就繼續取數字
while y != 0:
# res 的初始值為 0 , 其實不難發現,每次都取餘 y 的 10
# 也就是取輸入數字的最後一位
# 每次計算時 res * 10 其實也是為了增加一位從而實現倒敘插入數字的方式
res = res * 10 + y % 10
# 這個 if 語句在這裡可以節省一個對 0 的判斷
# 但是如果非0 每次到結束之前每次都要判斷
# 因此這裡筆者並沒有選擇在這裡使用該判斷語句
#if res > boundry:
#return 0
# 每次計算完後,都要去掉y的最後一位,這樣保證每次取餘的最後一位都是未加入 res 的
y //= 10
# 迴圈完後加入判斷,如果超出取值範圍,則根據要求直接返回 0
if res > boundry:
return 0
if res == 0:
return 0
# 如果要求末尾是 0 反轉後也要保留的話,可以加入此判斷語句
#if x % 10 == 0:
# res = "0" + str(res)
# 因為輸入的是 int 型別 所以句首的 0 會被自動去掉
# #如果輸入字元型 可以加入以下 while 語句來去掉句首的 0
#i = 0
#while str(x)[i] == "0":
#res = str(res) + "0"
#i += i
return res if x > 0 else -res


print(reverse(0, int(input())))





# 程式參考:
# 連結:https: // leetcode - cn.com / problems / reverse - integer / solution / pythondan - chu - he - tui - ru - shu -
# 作者:stray_camel