原文链接:https://leetcode.com/problems/palindrome-number/description/。这道题目难度是简单,然后解答也是简单易懂,虽然我还是没能写出正确答案。。。
我的思路
首先,我想到的是将整数转换为一个字符数组,然后再比对对应位置上的字符是否相同,但是题目说了不能使用额外的空间,而且这道题目是简单级别的,答案应该不至于太复杂,所以放弃了。。。
然后,我猜测是不是能根据某种位运算来作出判断呢?然后我看了下回文数 12321 的二进制 0011 0000 0010 0001,可以说是毫无规律可言,然后也放弃了。。。
最后,我想到对 10 做一系列的求除数、余数做判断,然后写出来下面似对非对的代码:
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.isPalindrome(233));
System.out.println(s.isPalindrome(232));
System.out.println(s.isPalindrome(2332));
System.out.println(s.isPalindrome(23432));
System.out.println(s.isPalindrome(234432));
}
public boolean isPalindrome(int x) {
int temp = 0;
while (x != 0) {
temp = temp * 10 + x % 10;
x = x / 10;
if (temp == x) {
return true;
}
if (temp > x) {
return false;
}
}
return false;
}
}
运行分析可以,如果测试数据长度是偶数基本上还能运行正确,但是测试数据长度是奇数就不行了。然后,我以为自己又已经走在错误的道路上了,江郎才尽就去看了下标准答案。没想到的是自己已经接近标准答案了。。。真的好可惜
官方答案
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.isPalindrome(233));
System.out.println(s.isPalindrome(232));
System.out.println(s.isPalindrome(2332));
System.out.println(s.isPalindrome(23432));
System.out.println(s.isPalindrome(234432));
}
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while(x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber/10;
}
}