題目描述
給你一個 32 位的有符號整數(shù) x ,返回將 x 中的數(shù)字部分反轉后的結果。
如果反轉后整數(shù)超過 32 位的有符號整數(shù)的范圍 [−231, 231 − 1] ,就返回 0。
假設環(huán)境不允許存儲 64 位整數(shù)(有符號或無符號)。
示例 1:
輸入:x = 123
輸出:321
示例 2:
輸入:x = -123
輸出:-321
示例 3:
輸入:x = 120
輸出:21
示例 4:
輸入:x = 0
輸出:0
問題分析
首先我們想一下,怎么去反轉一個整數(shù)?
用棧?
或者把整數(shù)變成字符串,再去反轉這個字符串?
這兩種方式是可以,但并不好。
- 實際上我們只要能拿到這個整數(shù)的 末尾數(shù)字 就可以了。
- 以12345為例,先拿到5,再拿到4,之后是3,2,1,我們按這樣的順序就可以反向拼接處一個數(shù)字了
- 也就能達到 反轉 的效果。
怎么拿末尾數(shù)字呢?
好辦,用取模運算就可以了
- 將12345 % 10 得到5,之后將12345 / 10
- 將1234 % 10 得到4,再將1234 / 10
- 將123 % 10 得到3,再將123 / 10
- 將12 % 10 得到2,再將12 / 10
- 將1 % 10 得到1,再將1 / 10
這么看起來,一個循環(huán)就搞定了,循環(huán)的判斷條件是x>0
但這樣不對,
- 因為忽略了 負數(shù)
- 循環(huán)的判斷條件應該是while(x!=0),無論正數(shù)還是負數(shù),
- 按照上面不斷的/10這樣的操作,最后都會變成0,所以判斷終止條件就是!=0
- 有了取模和除法操作,對于像12300這樣的數(shù)字,也可以完美的解決掉了。
看起來這道題就這么解決了,但請注意,題目上還有這么一句
假設我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [−2^31, 2^31 − 1]。
也就是說我們不能用long存儲最終結果,而且有些數(shù)字可能是合法范圍內的數(shù)字,但是反轉過來就超過范圍了。
假設有1147483649這個數(shù)字,它是小于最大的32位整數(shù)2147483647的,
但是將這個數(shù)字反轉過來后就變成了9463847411,
這就比最大的32位整數(shù)還要大了,這樣的數(shù)字是沒法存到int里面的,所以肯定要返回0(溢出了)。
甚至,我們還需要提前判斷
上圖中,綠色的是最大32位整數(shù)
第二排數(shù)字中,橘子的是5,它是大于上面同位置的4,這就意味著5后跟任何數(shù)字,都會比最大32為整數(shù)都大。
所以,我們到【最大數(shù)的1/10】時,就要開始判斷了
- 如果某個數(shù)字大于 214748364那后面就不用再判斷了,肯定溢出了。
- 如果某個數(shù)字等于 214748364呢,這對應到上圖中第三、第四、第五排的數(shù)字,
- 需要要跟最大數(shù)的末尾數(shù)字比較,如果這個數(shù)字比7還大,說明溢出了。
對于負數(shù)也是一樣的
上圖中綠色部分是最小的32位整數(shù),同樣是在【最小數(shù)的 1/10】時開始判斷
- 如果某個數(shù)字小于 -214748364說明溢出了
- 如果某個數(shù)字等于 -214748364,還需要跟最小數(shù)的末尾比較,即看它是否小于8。
以上就是python簡單實現(xiàn)整數(shù)反轉的畫解算法的詳細內容,更多關于python整數(shù)反轉的畫解算法的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- Python 實現(xiàn)反轉整數(shù)的案例(很容易懂的那種)
- python3整數(shù)反轉的實現(xiàn)方法
- python反轉(逆序)字符串的6種方法詳細
- python反轉列表的三種方式解析
- python對數(shù)組進行反轉的方法
- python算法題 鏈表反轉詳解