題目地址:
回文數(shù)
1.題目描述
判斷一個整數(shù)是否是回文數(shù)∧啵回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 卵皂。 從右向左讀, 為 121- 肾胯。因此它不是一個回文數(shù)。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 旬蟋。因此它不是一個回文數(shù)油昂。
進階:
你能不將整數(shù)轉(zhuǎn)為字符串來解決這個問題嗎?
2.題解
2.1.解題思路
看到那個正序和倒敘倾贰,入?yún)⑦€是整數(shù)冕碟,馬上想到可以將第七題改改拿過來直接用。
根據(jù)示例匆浙,負數(shù)不會是回文數(shù)安寺,所以只有正數(shù)會是回文數(shù)(還有0)。
2.2.第一版代碼
直接將第七題的整數(shù)反轉(zhuǎn)的代碼拿來改一改首尼,改完如下:
public boolean isPalindrome(int x) {
if (x < 0) {
return false;
}
int reverse = reverse(x);
if (reverse !=x) {
return false;
}
return true;
}
//整數(shù)反轉(zhuǎn)的代碼
public int reverse(int x) {
if (x / 10==0) {
return x;
}
long result = 0;
for (int i = 0; i < 10; i++) {
result=result*10+x%10;
if (result > Integer.MAX_VALUE) {
return 0;
}
x = x / 10;
if (x==0) {
break;
}
}
return new Long(result).intValue();
}
第一版代碼的運行結(jié)果如下:
內(nèi)存消耗還可以挑庶,但是耗時比單純的整數(shù)反轉(zhuǎn)多了很多言秸。
2.2.第二版代碼
官方題解給的解題思路也是整數(shù)反轉(zhuǎn),不過他們給的不是把整個數(shù)都反轉(zhuǎn)完迎捺,比較result和x是否相等井仰,而是在反轉(zhuǎn)過半的時候進行判斷。
在對x做除法的過程中:
long result = 0;
result=result*10+x%10;
x = x / 10;
在這個過程中,result在不斷增大,x在不斷的減小,當(dāng)result>=x時,代表來到了入?yún)的中間點破加。比如121俱恶,中間點是2,result=21,x=1的時候范舀,代表遍歷過半合是,退出循環(huán)。
當(dāng)x==result或x/10==result時锭环,代表x是回文數(shù)聪全。返回結(jié)果。循環(huán)結(jié)束條件是x<result辅辩,所以當(dāng)x為長度為奇位數(shù)的時候难礼,x==result/10也是符合條件的。
這樣會有一點小問題玫锋,尾數(shù)為0的蛾茉,經(jīng)過while循環(huán)處理之后,反轉(zhuǎn)的數(shù)并不構(gòu)成回文數(shù)撩鹿,需要排除這種情況谦炬。
下面是完整代碼:
public static boolean isPalindrome1(int x) {
//小于0或者是10的倍數(shù)都不符合要求,0是回文數(shù)
if (x < 0 || (x%10==0&&x!=0)) {
return false;
}
long result = 0;
//這里仍是整數(shù)反轉(zhuǎn)的循環(huán)节沦,更改了循環(huán)退出條件键思,去掉了越界判斷
while (x>result) {
result=result*10+x%10;
x = x / 10;
}
//循環(huán)退出的時候x<=result
//由于處于中位的數(shù)字總是與自身相等,所以可以簡單的去掉
return x==result||x==result/10;
}
第二版的運行結(jié)果如下:
emm,執(zhí)行耗時低了一點甫贯,內(nèi)存耗時多了一點吼鳞。
2.3.其他用戶提供的一個思路
還有一位用戶提供了一個思路,地址在這里:
https://leetcode-cn.com/problems/palindrome-number/solution/ji-bai-liao-99de-javayong-hu-dai-ma-you-ya-by-reed/
這位是同時首尾是否相同叫搁,如果相同赔桌,去掉首尾,再判斷下面的數(shù)字常熙,感興趣的可以去看一下纬乍。
3.總結(jié)
這道題官方預(yù)感到會有人將數(shù)字轉(zhuǎn)換為字符串碱茁,判斷字符串是否為回文串裸卫,這樣做當(dāng)然也能做,不過開銷會大很多纽竣,所以給了個提示墓贿,是否可以不將數(shù)字轉(zhuǎn)換為字符串進行求解茧泪。如果先做第七題的話,會首先想到使用整數(shù)反轉(zhuǎn)的思路來著聋袋,方便快捷队伟。
這道題同時也需要考慮邊界的問題,先將不符合的數(shù)提前返回幽勒。