Palindrome Number问题
1.问题描述
Determine whether an integer(整数) is a palindrome(回文). Do this without extra space.
题目翻译:
确定一个整数是不是回文数,不能使用额外的空间。
2.解题思路
1.把整数直接转成字符串,然后把字符串reverse一下,比较两个字符是否相等就能完成这道题。但是题目中说不能使用额外的空间,也就是说这种思路不可行。
2.把这个整数反转过来,然后比较翻转后的整数是否相等就可以,这种思路可行。但是反转整数的过程中可能遇到 整数溢出的问题,所以要处理好这个问题就可以解决,但同时一旦发生溢出,那么这个整数就不是回文数了。
3.无论是回文数还是回文串,都是对称的,但是需要处理好奇对称、偶对称问题,这样只需要反转整数的一半就可以实现对回文数的判断。
3.代码
1.反转数字,检查是否越界
- //
- class Solution {
- public boolean isPalindrome(int x) {
- int res=0;
- int tmp=0,sign=1;
- int sa=x;
-
- if(x<0)//小于0的数都不是回文数
- return false;
-
- while(x!=0){
- tmp = res*10+x%10;
- if(tmp/10!=res)//为了判断是否发生整数越界
- return false;
- x=x/10;
- res=tmp;
- }
- return res*sign==sa;
- }
- }
2.反转一半数字,检查是否相等
这里在实现的时候出现了一个问题,会把200、1000这类的数字误判为回文数。
- class Solution {
- public boolean isPalindrome(int x) {
- if(x<0||x%10==0&&x/10!=0)//
- return false;
- int res=0;
- while(x>res){
- res = res*10+x%10;
- x=x/10;
- }
- return x==res||x==res/10;//为了处理奇对称、偶对称问题。
- }
- }
- //对上面的代码进行的简单优化
- class Solution {
- public boolean isPalindrome(int x) {
- if(x==0)
- return true;
- if(x<0||x%10==0)//处理10的整数倍问题
- return false;
- int res=0;
- while(x>res){
- res = res*10+x%10;
- x=x/10;
- }
- return x==res||x==res/10;//为了处理奇对称、偶对称问题。
- }
- }