leetcode刷刷題(42) ---- 整數反轉(C語言版)

2020-6-2

  • Don’t spend another minute being angry about yesterday.
    不要再浪費時間爲昨天而懊惱。

題目

  • leetcode 7. 整數反轉
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

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

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

輸入: 120
輸出: 21
注意:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-integer
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

個人解答:(C版本)

  • 方法一:使用一個數組分別存儲這個整數按位拆分的數。(有點佔空間,不推薦該方法)
int reverse(int x){
    int buf[32] = {0};
    int flag = 1;
    long int var = 0;

    if(x < 0)
    {
        flag = -1;
        if(x == -((long)1<<31))
            return 0;
        x = -x;
    }

    int k = 0;
    for(int i=0; i<32 && x>0; ++i)
    {
        buf[i] = x%10;
        x /= 10;
        ++k;
    }

    for (int j=0; j<k; ++j)
    {
        var = var*10 + buf[j];
    }

    if(-1 == flag)
    {
        var = -var;
    }

    if((var < (-((long)1<<31))) || var>(((long)1<<31)-1))
        return 0;

    return (int)var;
}
  • 複雜度分析
    1)該算法的時間複雜度爲O(n)。
    2)由於只使用了常量空間,空間複雜度爲O(1)。
  • 運行結果:
    在這裏插入圖片描述
  • 方法二:對方法一進行優化,直接用一個64bit的長整形來保存轉換後的值,其他的無非是做些判斷,代碼就清晰多了。
int reverse(int x){
    int flag = 1; // 用來記錄是否是負數
    long int var = 0;

	// 標記正負,並求取其絕對值,對絕對值反轉更容易些
    if(x < 0)
    {
        flag = -1;
        if(x == -((long)1<<31)) // 如果是-2^31,求其絕對值就會溢出
            return 0;
        x = -x;  // 得到其絕對值
    }

	// 用一個長整型來存儲反轉的值,確保數據不會丟失
    while(x>0) 
    {
        var = var*10 + x%10;
        x /= 10;
    }

	// 若之前的數,爲負,則將反轉的數也取爲負數
    if(-1 == flag)
    {
        var = -var;
    }

	// 判斷反轉的數是否在32bit的範圍內
    if((var < (-((long)1<<31))) || var>(((long)1<<31)-1))
        return 0;

    return (int)var; // 返回強制轉換後的數
}
  • 複雜度分析
    1)該算法的時間複雜度爲O(n)。
    2)由於只使用了常量空間,空間複雜度爲O(1)。
  • 運行結果
    在這裏插入圖片描述
他山之石:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章