[leetcode]-7. 整數(shù)反轉(zhuǎn)-S

題目描述

  • 給你一個 32 位的有符號整數(shù) x 纷妆,返回將 x 中的數(shù)字部分反轉(zhuǎn)后的結(jié)果纵顾。
  • 反轉(zhuǎn)后整數(shù)超過 32 位的有符號整數(shù)的范圍 [?2^31, 2^31 ? 1] 愕秫,就返回 0丧肴。
  • 假設(shè)環(huán)境不允許存儲 64 位整數(shù)(有符號或無符號)蘸劈。

示例 1:

輸入:x = 123
輸出:321

示例 2:

輸入:x = -123
輸出:-321

示例 3:

輸入:x = 120
輸出:21

示例 4:

輸入:x = 0
輸出:0

提示:

-2^31 <= x <= 2^31 - 1

答題

1.兩步走

1.實現(xiàn)數(shù)據(jù)的反轉(zhuǎn)
如果是正數(shù):
tra = 0
while x != 0:
  n2 = x%10
  x = x //10
  tra = tra*10 + n2
如果是負(fù)數(shù)就abs()一下這個數(shù)
2.溢出判定
給出范圍[?2^31,  2^31 ? 1]
則輸出的結(jié)果tra就必須滿足這個范圍.
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        base = 1
        for i in range(31):
            base = base * 2
        two_Max = base - 1
        two_Min = -base
        tra = 0
        if x < 0:
            x = abs(x)
            while x != 0:
                n2 = x % 10
                if tra > abs(two_Min) // 10 or (tra == abs(two_Min) // 10 and n2 < -8):
                    return 0
                x = x // 10
                tra = tra * 10 + n2
            return -tra
        else:
            while x != 0:
                n2 = x % 10
                if tra > two_Max//10 or (tra == two_Max and n2 > 7 ):
                    return  0
                x = x // 10
                tra = tra * 10 + n2
            return tra

2.借助字符串

最直觀吆你,而且最容易理解的解題方案是:將數(shù)字轉(zhuǎn)為字符串弦叶,將字符串反轉(zhuǎn),再轉(zhuǎn)回數(shù)字妇多。Python3為我們提供了兩個內(nèi)置函數(shù)伤哺,str能int,前者能把數(shù)字轉(zhuǎn)為字符串者祖,而后者則可以將字符串轉(zhuǎn)為數(shù)字立莉。

def reverse(n):
    sign = 1      # 記錄數(shù)字的符號
    if n < 0:
        sign = -1
        n = -n

    s = str(n)    # 轉(zhuǎn)為字符串
    s = s[-1::-1] # 字符串反轉(zhuǎn)(中間有兩個冒號哦)
    n = int(s)    # 轉(zhuǎn)為數(shù)字

    return sign * n

然而,函數(shù)str在將數(shù)字轉(zhuǎn)為字符串的過程中七问,實際上是將數(shù)字的每個位拆開蜓耻,轉(zhuǎn)為對應(yīng)的字符,然后將這些字符拼裝在一起械巡,得到最終的結(jié)果刹淌。例如調(diào)用str(123),實際上是將123轉(zhuǎn)為字符系列(‘1’, ‘2’, ‘3’)讥耗,再將它們拼接成字符串‘123’有勾。
3.手動拆解數(shù)字

雖然,我們借助字符串葛账,可以寫出非常簡潔直觀的代碼柠衅,但程序運行階段卻做了一些沒有必要有重復(fù)運算。

實際上籍琳,我們可以模擬str函數(shù)拆解數(shù)字的過程菲宴,得到數(shù)字的每一個位。然后我們再將這些數(shù)位通過數(shù)學(xué)計算趋急,拼接成最終的結(jié)果喝峦。

拆解和拼接原理如下所示:

123 = ((1 * 10) + 2) * 10 + 3
123 => [1, 2, 3]
321 = ((3 * 10) + 2) * 10 + 1

如下的代碼實現(xiàn),就是根據(jù)這個拆解和拼接的原理而來的呜达。

def reverse(n):
     sign = 1        # 保存數(shù)字的符號
     if n < 0:
         sign = -1
         n = -n

     digits = []     # 從低到高存儲數(shù)字n的每個位
     while n != 0:
        # r保存當(dāng)前最低的位谣蠢,n保存待處理的數(shù)字
        # 假如n==123,則運行如下代碼之后,r==3, n==12
        r, n = n % 10, n // 10
        digits.append(r)

     n = 0
     for r in digits:
        # r, n = n % 10, n // 10 的逆過程
        n = n * 10 + r

     return n * sign

4.將拆解和拼裝過程合并

事實上眉踱,我們并不需要將拆解的數(shù)位單獨存儲起來挤忙。在拆解數(shù)字的每個位的過程中,就可以將這些位拼裝到目標(biāo)數(shù)字上去谈喳。這樣册烈,可以大大簡化我們的代碼。

def reverse(n):
    sign = 1      # 保存數(shù)字的符號
    if n < 0:
        sign = -1
        n = -n

    ret = 0
    while n != 0:
        # r保存當(dāng)前最低的位婿禽,n保存待處理的數(shù)字
        # 在ret中赏僧,越低位的r被乘10的次數(shù)越多,于是達(dá)到反轉(zhuǎn)的效果
        r, n = n % 10, n // 10
        ret = ret * 10 + r

    return ret * sign

5.將其轉(zhuǎn)為字符串進(jìn)行翻轉(zhuǎn)扭倾,并進(jìn)行正負(fù)的判斷淀零。最后,題目要求如果反轉(zhuǎn)后整數(shù)超過 32 位的有符號整數(shù)的范圍 [?2^31, 2^31 ? 1] 膛壹,就返回 0

class Solution:
  def reverse(self, x: int) -> int:
    str1 = str(x)
    
    if str1[0] == '-':
      str1 = str1[0] + str1[:0:-1]
    else:
      str1 = str1[::-1]
    return int(str1) if -2147483648<int(str1)<2147483648 else 0

6.不使用字符串驾中。當(dāng)翻轉(zhuǎn)后的數(shù)字大于條件就返回0

class Solution:
  def reverse(self, x: int) -> int:
 y, res = abs(x), 0
    # 則其數(shù)值范圍為 [?2^31, 2^31 ? 1]
    boundry = (1<<31) -1 if x>0 else 1<<31
    while y != 0:
      res = res*10 +y%10
      if res > boundry :
        return 0
      y //=10
    return res if x >0 else -res

偽代碼:

把傳入的值直接轉(zhuǎn)成字符串
把拿到的字符串判斷是正整數(shù),還是負(fù)整數(shù)
負(fù)整數(shù)取值模聋,直接從第二位開始取值哀卫,然后反轉(zhuǎn)
最后返回時,根據(jù)前面轉(zhuǎn)換后的值撬槽,判斷在不在 [?231, 231 ? 1]

import math
def reverse(x: int):
    str_x = str(x)
    if str_x[0] == '-':
        x = int("-" + (str_x[1::])[::-1])
    else:
        x = int(str_x[::-1])
 
    return x if math.pow(-2, 31) < x < math.pow(2, 31) - 1 else 0
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末此改,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侄柔,更是在濱河造成了極大的恐慌共啃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暂题,死亡現(xiàn)場離奇詭異移剪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)薪者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門纵苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人言津,你說我怎么就攤上這事攻人。” “怎么了悬槽?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵怀吻,是天一觀的道長。 經(jīng)常有香客問我初婆,道長蓬坡,這世上最難降的妖魔是什么猿棉? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮屑咳,結(jié)果婚禮上萨赁,老公的妹妹穿的比我還像新娘。我一直安慰自己兆龙,他們只是感情好位迂,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著详瑞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪臣缀。 梳的紋絲不亂的頭發(fā)上坝橡,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音精置,去河邊找鬼计寇。 笑死,一個胖子當(dāng)著我的面吹牛脂倦,可吹牛的內(nèi)容都是我干的番宁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赖阻,長吁一口氣:“原來是場噩夢啊……” “哼蝶押!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起火欧,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棋电,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后苇侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赶盔,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年榆浓,在試婚紗的時候發(fā)現(xiàn)自己被綠了于未。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡陡鹃,死狀恐怖烘浦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萍鲸,我是刑警寧澤谎倔,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站猿推,受9級特大地震影響片习,放射性物質(zhì)發(fā)生泄漏捌肴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一藕咏、第九天 我趴在偏房一處隱蔽的房頂上張望状知。 院中可真熱鬧,春花似錦孽查、人聲如沸饥悴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽西设。三九已至,卻和暖如春答朋,著一層夾襖步出監(jiān)牢的瞬間贷揽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工梦碗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留禽绪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓洪规,卻偏偏與公主長得像印屁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斩例,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容