题目描述
代码语言:javascript复制判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法
这个解法是参考上一题的思路,先判断整数是否是小于0或者是末位是0的情况,是的话直接返回false。然后对整数进行反转,如果反转后的整数等于原来的数,则是回文数。
代码语言:javascript复制public boolean isPalindrome(int x) {
int rev = 0;
int a = x;
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) {
return false;
}
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop > -8)) {
return false;
}
rev = rev * 10 pop;
}
return rev == a ? true : false;
}
用上面的方法会存在溢出的问题,官方的方法是只反转一半,然后判断两个部分是否相等。
这个方法则更加巧妙一些,不会出现溢出的情况,代码也更加简洁、优美。
如下:
代码语言:javascript复制public static boolean isPalindrome2(int x) {
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int rev = 0;
while (x > rev) {
rev = rev * 10 x;
x /= 10;
}
// 长度为奇数||前面,长度为偶数||后面
return x == rev || x == rev/10;
}
Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/leetcode进阶之路-回文数