回文数的定义: 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例1:

输入:121

输出:True

示例2:

输入:-121

输出:False

解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例3:

输入: 10

输出: false

解释: 从右向左读, 为 01 。因此它不是一个回文数。

思路:

映入脑海的第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。

第二个想法是将数字本身反转,但是这样做有一个风险,32位机器的int类型最大值为2147483647,反转后的数字可能超出范围造成溢出。

按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转 int\text{int}int 数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

例如,输入 1221,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。

算法:

首先我们要处理一些特殊情况,负数不可能是回文数,首先要禁止负数进入。

然后再考虑如何反转数字,例如1221,首先1221%10就可以得到最后一位数字1,然后将1221/10得到122,再次122%10得到倒数第二位数字2,最后用1*10+2=12就得到了我们反转后的数字12,用12和原数字的前两位对比即可判断该数字是不是回文数。

还存在一个问题:我们怎么知道自己反转了一半呢?

我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

代码实现:

Python 

class Solution(object):    
	def isPalindrome(self, x):        
		"""        
		:type x: int        
		:rtype: bool        
		"""        
		if x<0 or (x % 10 == 0 and x != 0):            			return False        
		y=0        
		while(x>y):            
			y=x%10+y*10            
			x /= 10;        
		return x==y or x==y/10
Java 
    
class Solution {    
    public boolean isPalindrome(int x) {        
        if(x < 0 || (x % 10 == 0 && x != 0))            		return false;        
        int res = 0;        
        while(x > res){            
            res = res * 10 + x % 10;            
            x /= 10;        
        }        
        return x == res || x == res / 10;    
    } 
}