題目來源力扣第七題,鏈接: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