回文数:原数与其倒置后的数相等
1.小数没有回文数
2.负数不是回文数
3.个位数都是回文数(包括0)
方法一:转成String
(本质:判断回文字符串)
缺点:需要额外的string空间
public static boolean isPalindrome(int x) {
if(x<0)
return false;
String a = Integer.toString(x);
int len = a.length();
for(int i=0 ; i<len/2 ; i++){
if(a.charAt(i) != a.charAt(len-1-i)){
return false;
}
}
return true;
}
方法二:整数的转置
(本质:转置后比较与原数是否相等)
缺点:int类型只有32位,范围(1-2^31~2^31-1),转置结果会发生溢出
题目:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
//我的
public int reverse(int x) {
int a = 0,i = 0;
long b = 0;
while(x != 0){
a = x%10;
b = b*10 +a;
x = x/10;
}
if(b<-2147483647 || b>2147483647)
return 0;
else{
int result = (int)b;
return result;
}
}
//大神的,不需要出现0xf7777777
public int reverse(int x)
{
int result = 0;
while (x != 0)
{
int tail = x % 10;
int newResult = result * 10 + tail;
if ((newResult - tail) / 10 != result)
{ return 0; }
result = newResult;
x = x / 10;
}
return result;
}
方法三:转置一半
(本质:利用对称性,只转置一半就比较是否相等;)
好处1:转置时间短;好处2:不会发生溢出
public boolean isPalindrome(int x) {
if(x<0 || (x != 0 && x%10 == 0)) //特殊情况x=10
return false;
int y = 0;
while(x > y){
y = y*10 + x%10;
x = x/10;
}
return(x == y || x == y/10);
}