回文数(java)
题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
进阶:能不用转换成字符串的方式解决吗?
样例:
输入:12321
输出:true
输入:-1221
输出:false
输入:10
输出:false
题解:
解一:
使用了转换成字符串的方法,首先负数和尾数带零的整数都不是回文数,先判断排除。再处理其他的情况,转换为字符串循环前半部分每一个字符与后半部分的对应字符比较,只要存在一个不相等的就不是回文数
public static boolean isPalindrome(int x) {
//判断回文数
//(1)转换成String解决的方法
if(x<0 | (x%10 == 0&&x!=0)) {
return false;
}else {
String y = Integer.toString(x);
for(int i=0 ; i<=y.length()/2 ; i++) {
if(y.charAt(i) != y.charAt(y.length()-i-1)) {
return false;
}
}
return true;
}
解二:
进阶的不使用字符串方法我实在是没想出来,就学习了官方解法
我理解的题解思路都写在注释里了。(不禁想感慨一句,算法文化博大精深!)
public static boolean isPalindrome(int x) {
//判断回文数
//直接在整数类型情况下判断
if(x<0 || (x%10==0&&x!=0)) {
return false;
}
//将整数后半部分反转,例如将123321转换成reverseHalf=123和x=123,
//或者将12321转换成reverseHalf=123和x=12
int reverseHalf = 0;
while(x>reverseHalf) {
reverseHalf = reverseHalf *10 + x%10;
x /= 10;
}
//偶数位情况下返回判断reverseHalf==x的情况
/*奇数位情况下由于中心位不影响判断(他自己永远等于他自己),于是将reverseHalf的最后一位(即中心位)去掉(操作reverseHalf/10),
并返回判断与x是否相等的结果*/
return x == reverseHalf || x == reverseHalf/10;
}