题目:
Determine whether an integer is a palindrome. Do this without extra space.
确定整数是否是回文。 这样做没有额外的空间。
思路:
此题是来判断一个数是否是回文数。首先,什么是回文数,下面给出回文数的定义。设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。(注意:负数没有回文数;小数也没有回文数)
读到这里的时候我心里已经有了初步的思路。只要得到该数倒置,再将其与原数进行比较,若相同就是回文数,若不同就不是。上次刚刚结束了一道整数倒置的题目,这次正好拿来用。
本题我就用两种方法来解决。一种是:利用上题目倒置的思想来完成。另一种方法在下面讲述。
首先是第一种方法:倒置。
代码:
public class Solution {
public boolean isPalindrome(int x) {
if(x<0){
return false;
}else {
Solution solution = new Solution();
int con = solution.reverse(x);
if(con==x){
return true;
}else {
return false;
}
}
}
public int reverse(int x){
int sign=1;
long reversed = 0;
for(;x>0;x/=10){
reversed = reversed*10+x%10;
}
return (int) reversed;
}
}
reverse() 函数是倒置函数。倒置后再与原数进行比较。
上述代码的执行效率如图:
第二种方法:
首先判断整数是否是负数、是否越界。如果是,就返回false。若不是,就将整数的每一位都存在字符数组中。给定两个数i,j来记录char数组的每一位,从两侧开始。如果两个字符相等就将角标向内移动。如果两个字符不相等,就直接返回False,直到两个角标所指的数一致或者前角标所指的数落在了后角标所指的数的后方为止。
代码:
public class Solution {
public boolean isPalindrome(int x) {
boolean flag = true;
if(x<0 || x>Integer.MAX_VALUE){
flag = false;
}else{
Integer integer = x;
String str = integer.toString();
char[] num = new char[str.length()];
for(int s = 0;s < str.length();s++){
num[s] = str.charAt(s);
}
int i = 0;
int j = num.length-1;
while(i<=j){
if(num[i]==num[j]){
i++;
j--;
}else{
flag = false;
break;
}
}
}
return flag;
}
}
上述代码的执行效率如下图: