程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

《畫解算法》2.整數反轉【python-簡單】

編輯:Python

作者主頁:不吃西紅柿

簡介:CSDN博客專家、信息技術智庫公號作者。簡歷模板、職場PPT模板、技術難題交流、面試套路盡管【關注】私聊我。

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

如果反轉後整數超過 32 位的有符號整數的范圍 [−231,  231 − 1] ,就返回 0。

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

示例 1:

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

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

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

輸入:x = 0 輸出:0

首先我們想一下,怎麼去反轉一個整數? 用棧? 或者把整數變成字符串,再去反轉這個字符串? 這兩種方式是可以,但並不好。實際上我們只要能拿到這個整數的 末尾數字 就可以了。 以12345為例,先拿到5,再拿到4,之後是3,2,1,我們按這樣的順序就可以反向拼接處一個數字了,也就能達到 反轉 的效果。 怎麼拿末尾數字呢?好辦,用取模運算就可以了

1、將12345 % 10 得到5,之後將12345 / 10 2、將1234 % 10 得到4,再將1234 / 10 3、將123 % 10 得到3,再將123 / 10 4、將12 % 10 得到2,再將12 / 10 5、將1 % 10 得到1,再將1 / 10

這麼看起來,一個循環就搞定了,循環的判斷條件是x>0 但這樣不對,因為忽略了 負數 循環的判斷條件應該是while(x!=0),無論正數還是負數,按照上面不斷的/10這樣的操作,最後都會變成0,所以判斷終止條件就是!=0 有了取模和除法操作,對於像12300這樣的數字,也可以完美的解決掉了。

看起來這道題就這麼解決了,但請注意,題目上還有這麼一句

假設我們的環境只能存儲得下 32 位的有符號整數,則其數值范圍為 [−2^31,  2^31 − 1]。

也就是說我們不能用long存儲最終結果,而且有些數字可能是合法范圍內的數字,但是反轉過來就超過范圍了。 假設有1147483649這個數字,它是小於最大的32位整數2147483647的,但是將這個數字反轉過來後就變成了9463847411,這就比最大的32位整數還要大了,這樣的數字是沒法存到int裡面的,所以肯定要返回0(溢出了)。 甚至,我們還需要提前判斷

 上圖中,綠色的是最大32位整數 第二排數字中,橘子的是5,它是大於上面同位置的4,這就意味著5後跟任何數字,都會比最大32為整數都大。 所以,我們到【最大數的1/10】時,就要開始判斷了 如果某個數字大於 214748364那後面就不用再判斷了,肯定溢出了。 如果某個數字等於 214748364呢,這對應到上圖中第三、第四、第五排的數字,需要要跟最大數的末尾數字比較,如果這個數字比7還大,說明溢出了。

對於負數也是一樣的

上圖中綠色部分是最小的32位整數,同樣是在【最小數的 1/10】時開始判斷 如果某個數字小於 -214748364說明溢出了 如果某個數字等於 -214748364,還需要跟最小數的末尾比較,即看它是否小於8。

(優質好文持續更新中……)


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved