题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
基本思路
- 方法一:转化为字符串,然后直接反转对比原始字符串和反转后的字符串
- 方法二:长度为n的字符串,取出索引为0和n-1,1和n-2 …的索引对应的数字对比,不同则返回false。
- 方法三:题解提供的最简单方法,直接取后半段的数字反转后与前半段对比,关键部分在于判断截取下来的部分是否已经截取过半,因此需要判断截取后的数字与前半段数字的大小关系。
代码实现
方法一二
package com.immunize.leetcode.isPalindrome1;
/**
* 方法二
*
* @author Mr IMMUNIZE
*
*/
public class Solution {
public boolean isPalindrome(int x) {
/*
* 方法一:
*
* return (x + "").equals((new StringBuilder(x + "")).reverse().toString());
*/
if (x < 0)
return false;
// 获取当前x的位数
int div = 1;
while (x / div >= 10) {
div *= 10;
}
while (x > 0) {
// 最高位
int left = x / div;
// 最低位
int right = x % 10;
if (left != right)
return false;
// 去掉最高位和最低位后的x
x = (x % div) / 10;
// 因为去掉了2位数,所以被除数div也要少2位
div /= 100;
}
return true;
}
}
方法三
package com.immunize.leetcode.isPalindrome1;
/**
* 方法三:
*
* @author Mr IMMUNIZE
*
*/
public class Solution {
public boolean isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0))
return false;
int Rx = 0;
// x每次去除最低位
while (x > Rx) {
Rx = Rx * 10 + x % 10;
x /= 10;
}
// 偶数则相等,奇数x则等于截取数字去掉最后一位。
return x == Rx || x == Rx / 10;
}
}