回文数的定义:回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例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;
}
}
网友评论