【LeetCode 題解】系列傳送門: http://www.cnblogs.com/double-win/category/573499.htmlhtml
Determine whether an integer is a palindrome. Do this without extra space.git
Some hints:this
Could negative integers be palindromes? (ie, -1)spa
If you are thinking of converting the integer to string, note the restriction of using extra space.rest
You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that the reversed integer might overflow. How would you handle such case?code
There is a more generic way of solving this problem.htm
判斷一個整數是不是迴文數。要求使用常量空間。blog
提示:ci
(1)負數是不是迴文數?字符串
(2)注意常量空間複雜度。將數字轉換成字符串是不可行的。
若是將整個數字轉換再判斷是不是迴文數,那麼就可能出現反轉以後的數字越界。
延續這個思路,可否經過某些技巧來避免越界呢?先看下面的例子:
(1) 1234321 / 12344321
將數字分紅等長的兩部分: 1234 和 4321。那麼能夠看出 4321 反轉以後的數字爲1234. 二者相等,因此1234321爲迴文數。
(2) 12345321
將數字分紅等長的兩部分: 1234 和 5321。那麼能夠看出 5321 反轉以後的數字爲1235.
因爲1234!=1235,因此12345321不是迴文數。
從上面兩個例子能夠看出。在處理一個數字是不是迴文數的過程當中,沒有必要將整個數字反轉。而只須要判斷數字的先後等長的兩部分時候相等便可。
那麼如何在常量空間複雜度內,將數字分紅先後兩部分呢?
記 須要判斷的數字爲x,其前一部分爲firstpart=x,後一部分爲secondpart=0.
採起依次取firstpart的末位,將其添加到secondpart的尾部的方式,直到firstpart<=secondpart.
firstpart | secondpart |
1234321 | 0 |
123432 | 1 |
12343 | 12 |
1234 | 123 |
123 | 1234 |
當firstpart<secondpart時,只需反過來將secondpart最後一位轉移到firstpart末位便可。
tmp=1234%10=4;
firstpart=firstpart*10+tmp=123*10+4=1234。
此時secondpart也爲1234.
所以1234321爲迴文數。
class Solution { public: bool isPalindrome(int x) { int first=x,second=0,tmp; if(x==0) return true; //zero if(x<0|| x%10==0) return false; //negative number or the number is dividable by 10 while(first>second){ // reverse the number tmp=first%10; second= second*10+tmp; first/=10; } if(first==second) return true; else{ // handle the number with odd digits tmp = second%10; first=first*10+tmp; if(first==second) return true; else return false; } return false; } };