banner
ekko

ekko's blog

时间不在于你拥有多少,而在于你怎样使用
github
xbox
email

整數反轉

描述#

示例 1:

輸入: 123
輸出: 321

示例 2:

輸入: -123
輸出: -321

示例 3:

輸入: 120
輸出: 21

注意:

假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。

思路#

  • 提取正負號
  • 轉化為正數後提取每一位數
  • 倒序將提取出的數賦值相加
  • 溢出判斷
int reverse(int x){
    char sign = 1,nums = 0,value[10] = {0};
    int final = 0;
    long final_long = 0;
    //符號提取,數字提取
    if(x < 0) {
        if(x == -2147483648)//-2^31,溢出無法轉化正數,且反轉後溢出
            return 0;
        else
            x = -x;
        sign = -1;
    }
    //獲取x位數
    for(;x;nums++) {
        value[nums] = x % 10;
        x = x / 10;
    }

    for(int i=0;nums > 0;nums--) {
        final_long += value[i++];

        if(nums > 1)//還有下一位
            final_long *= 10;
    }
    final = (int)final_long;
    if(final == final_long)
        return final * sign;
    else
        return 0;
    
}

注意#

  • 錯誤檢查一個是能否轉化為合格正數,一個是反轉後是否發生溢出

------------------------------------------- 分割線!!!!-------------------------------------------------------

更新#

在網上看到一些其他人的解法,醍醐灌頂,直接可以將上述代碼簡化很多很多,直接上代碼:

int reverse(int x){
    int final = 0;
    long final_long = 0;   

    while(x) {
        final_long = final_long * 10 + x % 10;
        x = x / 10;
    }
    final = (int)final_long;
    if(final == final_long)
        return final;
    else
        return 0;
    
}
  1. 原本的提取正負號,其實根本沒有必要,因為正數和負數在運算過程中,唯一不同的就是取餘的最後一位,負數最後一位的取餘是帶著正負號的,所以直接算就可以了,自己還是思維比較死板啊,想當然地多此一舉
  2. 最終結果的計算和取餘的過程可以合在一起,我之前總是紛結於要得到整數的位數,才能繼續計算,其實就像上面一樣,取一次餘繼續 ×10 就可以了,過程真的簡化了好多好多
  • 自己的定式思維在沒有直接對比時真的完全意識不到有多少學習,這道題算是沒有白做,學到了很多
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。