"""
給你一個 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