整數反轉


題目來源力扣第七題,鏈接:https://leetcode-cn.com/problems/reverse-integer

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

示例 1:

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

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

輸入: 120
輸出: 21
注意:

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


解題思路:

1. 設輸入為 “123

2. 每次取最后一位數據進行計算(結果加上其數值與權值相乘)然后加上其結果,如上例中,

   2.1 取 ”123“中的”3“,3 * 100 = 300

   2.2 取”123“中的”2“, 2 * 10 =20

 2.3 取”123“中的”1“, 1 * 1 = 1

故結果為:300 + 20 + 1 = 321

3. 實時判斷數據是否溢出,若溢出返回0

  3.1 實時判斷結果值是否大於INI_MAX/10 或小於 INI_MIN/10,如達到此條件則需要留意數據是否還有下一位,如有則可判斷為溢出。

       3.2 實時判斷結果值是否等於INI_MAX/10或INI_MIN/10, 如達到此條件則需要考慮數據下一位是否有,若有,是否大於7或者小於-8,若是,則溢出返回0。


代碼:

#include <iostream>
#include <climits>
using  namespace std;

class Solution {
public:
    int reverse(int x) {
        int result(0);
        while (x!=0) {
            if (result > INT_MAX / 10 || (result == INT_MAX && x > 7)) {
                return 0;
            }
            if (result < INT_MIN / 10 || (result == INT_MIN && x < -8)) {
                return 0;
            }
            result *=10; // 每取出一位數,則提升之前所有已取出位數的權值
            result += x % 10; // 取出最后一位數,並加到結果中
            x /= 10; // 舍去已添加位數
        }
        return result;
    }
};
int main() {
    Solution solution;
    int eg0(2147483647), eg1(1463847412), eg2(-123456);
    cout << "eg0: " << solution.reverse(eg0) << endl;
    cout << "eg1: " << solution.reverse(eg1) << endl;
    cout << "eg2: " << solution.reverse(eg2) << endl;
    return 0;
}

輸出:

eg0: 0
eg1: 2147483641
eg2: -654321

學習了一下他人的代碼發現,自己身體不清,考慮不周。由於題目中假設環境中只能存儲32位數據,故無論輸入數據還是輸出數據均只能為32位數據,故無需做 上述中3.2的判斷。若結果前九位的值未超過INI_MAX以及未小於INI_MIN的值,則無需判斷第十位是否溢出,因為,其值只能在 -2 ~

 2 之間


 

代碼修改:

#include <iostream>
#include <climits>
using  namespace std;

class Solution {
public:
    int reverse(int x) {
        int result(0);
        while (x!=0) {
            if (result > INT_MAX / 10) {
                return 0;
            }
            if (result < INT_MIN / 10) {
                return 0;
            }
            result *=10;
            result += x % 10;
            x /= 10;
        }
        return result;
    }
};
int main() {
    Solution solution;
    int eg0(2147483647), eg1(1463847412), eg2(-123456);
    cout << "eg0: " << solution.reverse(eg0) << endl;
    cout << "eg1: " << solution.reverse(eg1) << endl;
    cout << "eg2: " << solution.reverse(eg2) << endl;
    return 0;
}

輸出:

eg0: 0
eg1: 2147483641
eg2: -654321


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM