題目:
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;
}
}
上述代碼的執行效率如下圖: