題目描述:
題目難度:簡(jiǎn)單
給出一個(gè) 32 位的有符號(hào)整數(shù),你需要將這個(gè)整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。
- 示例 1:
輸入: 123
輸出: 321 - 示例 2:
輸入: -123
輸出: -321 - 示例 3:
輸入: 120
輸出: 21
注意:
假設(shè)我們的環(huán)境只能存儲(chǔ)得下 32 位的有符號(hào)整數(shù),則其數(shù)值范圍為 [?2^31, 2^31 ? 1]。請(qǐng)根據(jù)這個(gè)假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。
笨辦法:
該題比較簡(jiǎn)單,解題方法很直觀。所謂笨辦法,也就是第一反應(yīng)的解法,沒有經(jīng)過細(xì)節(jié)的優(yōu)化。
基本的思路是:記錄下整數(shù)的正/負(fù)符號(hào),對(duì)整數(shù)取絕對(duì)值。從低位到高位逐位左移,通過取余數(shù)得到整數(shù)的各個(gè)位,將各個(gè)位存入數(shù)組。利用數(shù)組中的數(shù)字v和索引i,就可以得到反轉(zhuǎn)后的整數(shù)的各位。索引i處的數(shù)字v,對(duì)應(yīng)反轉(zhuǎn)后的整數(shù)位為v*10 **(l-i-1),其中l(wèi)表示數(shù)組的長(zhǎng)度。注意:不要忘記把正負(fù)符號(hào)加回來,以及對(duì)超過合法范圍的情況的處理。
聰明辦法:
參考官方提示,大體的思路基本與前述方法一致。但在細(xì)節(jié)處理上可以更加簡(jiǎn)單,比如根本就不需要用到數(shù)組。具體的處理步驟如下:
- 對(duì)于整數(shù)x,可先取絕對(duì)值abs(x),單獨(dú)記錄正負(fù)符號(hào)op,這樣就只需要處理x為正數(shù)的情況。
- 通過以下算式得到反轉(zhuǎn)后的整數(shù)ans,ans的初始值為0。
ans=ans*10+x%10
x=x//10
此算式的結(jié)束條件是x==0。 - 單獨(dú)處理ans超過取值范圍的情況,用16進(jìn)制表示[?2^31, 2^31 ? 1]較為方便。
return ans*op if ans<=0x7FFFFFFF else 0
笨辦法:
用時(shí)40ms,此方法擊敗了30%的用戶。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
s=[]#記錄整數(shù)的各個(gè)位
op=1 if x>0 else -1#符號(hào)
n=abs(x)
hi,lo=2**31-1,-2**31
while n>0:
s.append(n%10)
n=n//10
# 注意符號(hào)
l=len(s)
res=0
for i,v in enumerate(s):
res=res+v*10**(l-i-1)
res=op*res
if res>=hi or res<=lo:
return 0
return res
聰明的方法:
同時(shí)也是簡(jiǎn)潔的方法,此方法用時(shí)36ms,擊敗了93%的用戶。
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
op=1 if x>0 else -1#符號(hào)
n=abs(x)
ans=0
while n>0:
ans=ans*10+n%10
n=n//10
return ans*op if ans<=0x7FFFFFFF else 0