题目:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
思路:
首先负数肯定不是回文数,若输入为负数,则直接判断,剩下非负数将其转换为字符串,字符串从串两头向中间遍历并比较两头元素是否相等。
代码:
public static boolean isPalindrome(int x) {
if(x<0) {
return false;
}
String s = x+"";
for(int i=0;i<=s.length()/2;i++) {
if(s.charAt(i)!=s.charAt(s.length()-i-1)) {
return false;
}
}
return true;
}
优化:
不将数字转字符串,直接利用除数和取余的方式获取数字的头尾元素。代码细节还是蛮多的,不细说。举个例子,输入整数为12321,首先12321 / 10000 = 1(最高位)12321 % 10 = 1(最低位),然后比较最高位和最低位。12321 %1000 = 12 ,12 - 1*10 = 2(第二高位,1*10中的1为最高位求得的),12321 % 100 = 21, (21 - 1)/ 10 = 2(第二低位,所减1位最低位),然后比较第二高位和第二低位,直到比较到最中间的位。
代码:
public static boolean isPalindrome1(int x) {
if(x<0) {
return false;
}
int len = 0;
int rest1 = 0,rest2 = 0;
int sub1=1, sub2 = 10;
int tempx = x;
while(tempx>0) {
tempx = tempx/10;
len++;
sub1 = sub1 * 10;
if(len == 1) {
sub1 = sub1 / 10;
}
}
for(int i=0;i<=len/2&&sub1>=sub2;i++) {
if((x / sub1 - rest1 * 10)!=(x % sub2 - rest2)*10/sub2) {
return false;
}
rest1 = x / sub1;
rest2 = x % sub2;
sub1 = sub1 / 10;
sub2 = sub2 * 10;
}
return true;
}
注:不使用转字符串的方式还要注意不要导致整数溢出。