力扣7:整數反轉
- 題目
- 思路
- 代碼
題目
給你一個 32 位的有符號整數 x ,返回將 x 中的數字部分反轉后的結果。
如果反轉后整數超過 32 位的有符號整數的范圍 [?2^31, 2^31 ? 1] ,就返回 0。
思路
這道題我們可以分成兩部分來做,一是完成反轉二是檢測是否溢出。
我們先說第一部分,想要完成反轉我們可以一位一位的插入數字,但是返回值和參數都是整數類型所以我們只能使用數學方法來完成插入。我們每次都讓參數對10進行取模也就是得到最后一位數字number,再讓返回值*10+number。這樣就可以完成數學方法的插入了。
第二部分也是最關鍵的部分,如何判斷是否溢出,2^31-1=2147483647。這是一個十位數字所以我們判斷的關鍵也就是十位數字。我們先假設如果參數x就是2147483647,反轉過來就是7463847412這明顯是溢出了但是我想讓大家思考一下,反轉過來的數字y它的最后一位是多少?當然僅僅是在x為十位數字的時候,我們可以發現y的最后一位也就是x的首位它不就只有兩個值嗎1或者2,因為參數x也不能溢出啊。所以說是判斷十個數字是否溢出其實我們只需要判斷前九位是否溢出就可以。那么怎么判斷是否溢出呢?也很簡單,既然只需要判斷前九位是否溢出我們直接判斷y是不是小于INT_MAX/10不就可以了。對于負數也是一樣的只需要判斷y是不是大于INT_MIN/10即可。也就是說整個判斷的條件就是INT_MIN/10<y<INT_MAX/10,只要y在這個范圍內就算最后還要插入第十位數字我們也可以保證不會溢出因為第十位只能是1或者2。
代碼
class Solution {
public:int reverse(int x) {int res = 0;while (x != 0) {// 提前判斷下面給res插入數字后會不會溢出//判斷前九位即可if (res < INT_MIN / 10 || res > INT_MAX / 10) {return 0;}int number = x % 10;x /= 10;res = res * 10 + number;}return res;}
};