Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward. Example 1:
Input: 121
Output: true
Example 2:
Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:
Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Follow up: Coud you solve it without converting the integer to a string? 我們先寫幾個數(shù)字: -12321 //不是回文數(shù)
6 //是回文數(shù)
10 //不是回文數(shù)
123454321 //是回文數(shù)
12344321 //是回文數(shù)
??設傳入的數(shù)為x。這里我們需要判斷一個數(shù)是否為回文數(shù),首先小于10的數(shù)肯定是回文數(shù),負數(shù)肯定不是回文數(shù),十的倍數(shù)肯定不是回文數(shù),這里我們可以提前確定。 if(x<0) return false;
if(x<10) return true;
if(x==0) return false;
??以上條件是可以一眼看出來的,那大于10的回文數(shù)怎么判斷呢,可以觀察一下回文數(shù)的特性。 ??123454321 ??最高位等于最低位,次高位等于次低位,依次下去。我們想取得高位很麻煩,取到低位倒是很簡單,可以用x。在用x/=10,我們可以通過循環(huán)依次獲取到1,2,3,4,5,4,3,2,1。我們將這些獲得到的數(shù)字*10 下一位到最后不就是x?這種辦法是行的通的。 class Solution{
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x == 0)) return false;//小于0,10的倍數(shù)都不是回文數(shù)
if (x < 10) return true;//小于10大于等于0的是回文數(shù)
int num = 0;
int temp = x;
while (x != 0){
num = num*10 x;//從最低位開始算x的倒置值
x = x/10;
}
return num==temp;//如果倒置值等于x的值則是回文數(shù)返回true,否則false
}
}
??這個方法將整個回文數(shù)都遍歷一遍,很明顯回文數(shù)是具有對稱性的,有沒有什么辦法可以只遍歷一半的回文數(shù)解決問題。 ??如果回文數(shù)位數(shù)是偶數(shù)位的話,例如123321,我們從最低位算倒置數(shù)時,遍歷到一半,123 等于此時x(123),此時可以判定123321是回文數(shù)。 ??如果回文數(shù)位數(shù)是奇數(shù)位的話,例如1234321,我們從最低位算倒置數(shù)時,遍歷到一半,123 等于此時x(1234),此時怎么判定呢?不管中間數(shù)(4)是多少只要此時倒置數(shù)等于x/10也能判定此數(shù)是回文數(shù)。 class Solution{
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x == 0)) return false;
if (x < 10) return true;
int num = 0;
while (x > num){//此時num不能大于x
num = num*10 x;
x = x/10;
if(num == x/10)return true;//奇數(shù)位回文數(shù)會在這里退出
}
return x == num;//偶數(shù)位回文數(shù)會在這里退出
}
}
??另一種寫法:因為num不能大于等于x,num >= x時會跳出循環(huán),此是如果x == num/10也是回文數(shù)(此時回文數(shù)是奇數(shù)位)。num == x時也是回文數(shù)(此時回文數(shù)是偶數(shù)位)。 class Solution{
public boolean isPalindrome(int x) {
if (x < 0 || (x != 0 && x == 0)) return false;
if (x < 10) return true;
int num = 0;
while (x > num){
num = num*10 x;
x = x/10;
}
return x == num || x == num/10;
}
} 來源:http://www./content-4-135251.html
|