標籤:max 解決 code round lin 返回 sem 溢出 還原
題目來源:leetcode Reverse Integer
Given a 32-bit signed integer, reverse digits of an integer.
Example 1: Example 2: Example 3:
Input: 123 Input: -123 Input: 120
Output: 321 Output: -321 Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [?231, 231 ? 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
思路:
-
- 數值本身就溢出。
- 數值將要溢出,分界在未知數與INT_MAX位元相同。
- 數值在安全範圍內。
-
- 先判斷溢出,若溢出直接返回0
- 邊位元壓縮,邊倒轉,判斷溢出,若溢出返回0
- 直接倒轉
前提處理:
1 int m=x,i=1,ten=1;//i記錄位元,ten記錄最高位元要*10的2 while(m/=10){ ++i;ten*=10;}3 if(i<10) m=reversemin(x,i,ten);4 else m=reversemax(x,i,ten);
判斷數值溢出:
1 unsigned int y = x;//擴大範圍
2 if(x<0) y=-x;
3 if(y>INT_MAX) return 0;
位元壓縮,並倒轉:
1 int reversemax(int x,int i,int ten) 2 { 3 int sign=1; 4 if(x<0) {x=-x; sign=-1;}//負數變為正數,sign還原負數 5 int m=0,max=INT_MAX; 6 while (i--) { 7 int rest = x % 10; 8 int mrest=max/ten; 9 if(rest>mrest) return 0;//與INT_MAX位元壓縮,如果大於則已經溢出,返回010 else if(rest<mrest) break;//如果小於則進入了安全範圍,跳到安全的倒轉11 m += rest * ten;//只有在相等的情況才需要進行下一次比較12 x /= 10;13 max=max-mrest*ten;14 ten /= 10;15 }16 if(ten==0) return m*sign;17 ++i;//最後一次迴圈中止時,沒有操作,所以還原被刪去的位元18 19 while (i--) {//正常倒轉20 int rest = x % 10;21 m += rest * ten;22 x /= 10;23 ten /= 10;24 }25 return m*sign;26 27 }
!負數模數之後是負數,無法進行比較,所以先取正。
!判斷是否倒轉完,第16行,不能用位元,因為中斷出來位元也減了1
直接倒轉:
1 int reversemin(int x, int i, int ten) 2 { 3 int m = 0; 4 while (i--) { 5 int rest = x % 10; 6 m += rest * ten; 7 x /= 10; 8 ten /= 10; 9 }10 return m;11 }
整體代碼:
1 class Solution { 2 public: 3 int reverse(int x) { 4 unsigned int y = x; 5 if(x<0) y=-x; 6 if(y>INT_MAX) return 0; 7 int reversemin(int x, int i, int ten); 8 int reversemax(int x,int i,int ten); 9 int m=x,i=1,ten=1;10 while(m/=10){ ++i;ten*=10;}11 if(i<10) m=reversemin(x,i,ten);12 else m=reversemax(x,i,ten);13 return m;14 }15 };16 int reversemin(int x, int i, int ten)17 {18 int m = 0;19 while (i--) {20 int rest = x % 10;21 m += rest * ten;22 x /= 10;23 ten /= 10;24 }25 return m;26 }27 int reversemax(int x,int i,int ten)28 {29 int sign=1;30 if(x<0) {x=-x; sign=-1;}31 int m=0,max=INT_MAX;32 while (i--) {33 int rest = x % 10;34 int mrest=max/ten;35 if(rest>mrest) return 0;36 else if(rest<mrest) break;37 m += rest * ten;38 x /= 10;39 max=max-mrest*ten;40 ten /= 10;41 }42 if(ten==0) return m*sign;43 ++i;44 45 while (i--) {46 int rest = x % 10;47 m += rest * ten;48 x /= 10;49 ten /= 10;50 }51 return m*sign;52 53 }
[c++]關於倒轉32位int整數的範圍控制問題