【leetCode】整數(shù)反轉(zhuǎn)

題目

給出一個 32 位的有符號整數(shù),你需要將這個整數(shù)中每位上的數(shù)字進(jìn)行反轉(zhuǎn)。

示例 1:

輸入: 123
輸出: 321

示例 2:

輸入: -123
輸出: -321

示例 3:

輸入: 120
輸出: 21

注意:

假設(shè)我們的環(huán)境只能存儲得下 32 位的有符號整數(shù),則其數(shù)值范圍為 [?231, 231 ? 1]。請根據(jù)這個假設(shè),如果反轉(zhuǎn)后整數(shù)溢出那么就返回 0。

鏈接:https://leetcode-cn.com/problems/reverse-integer

題目解答

方法:彈出和推入數(shù)字 & 溢出前進(jìn)行檢查
思路

我們可以一次構(gòu)建反轉(zhuǎn)整數(shù)的一位數(shù)字。在這樣做的時候,我們可以預(yù)先檢查向原整數(shù)附加另一位數(shù)字是否會導(dǎo)致溢出。

算法

反轉(zhuǎn)整數(shù)的方法可以與反轉(zhuǎn)字符串進(jìn)行類比。

我們想重復(fù)“彈出” x 的最后一位數(shù)字,并將它“推入”到\text{rev}的后面。最后,\text{rev} 將與 x 相反。

要在沒有輔助堆棧 / 數(shù)組的幫助下 “彈出” 和 “推入” 數(shù)字,我們可以使用數(shù)學(xué)方法。

//pop operation:
pop = x % 10;
x /= 10;//push operation:
temp = rev * 10 + pop;
rev = temp;

但是,這種方法很危險,因為當(dāng) temp=rev?10+pop 時會導(dǎo)致溢出。

幸運(yùn)的是,事先檢查這個語句是否會導(dǎo)致溢出很容易。

為了便于解釋,我們假設(shè)\text{rev}是正數(shù)。

如果 temp=rev?10+pop 導(dǎo)致溢出,那么一定有 \text{rev} \geq \frac{INTMAX}{10}
如果\text{rev} > \frac{INTMAX}{10}

,那么 temp=rev?10+pop一定會溢出。
如果 \text{rev} == \frac{INTMAX}{10},那么只要 \text{pop} > 7,temp=rev?10+pop 就會溢出。
當(dāng) \text{rev} 為負(fù)時可以應(yīng)用類似的邏輯。

public int reverse(int x) {
       int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
 }

復(fù)雜度分析

時間復(fù)雜度:O(\log(x))x 中大約有 \log_{10}(x) 位數(shù)字。

空間復(fù)雜度:O(1)

標(biāo) 題:《【leetCode】整數(shù)反轉(zhuǎn)
作 者:zeekling
提 示:轉(zhuǎn)載請注明文章轉(zhuǎn)載自個人博客:小令童鞋

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容