問題描述
給你一個(gè)整數(shù) x ,如果 x 是一個(gè)回文整數(shù)彤守,返回 true 毯侦;否則,返回 false 具垫。
回文數(shù)是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數(shù)侈离。例如,121 是回文筝蚕,而 123 不是卦碾。
示例 1:
輸入:x = 121
輸出:true
示例 2:
輸入:x = -121
輸出:false
解釋:從左向右讀, 為 -121 。 從右向左讀, 為 121- 起宽。因此它不是一個(gè)回文數(shù)洲胖。
示例 3:
輸入:x = 10
輸出:false
解釋:從右向左讀, 為 01 。因此它不是一個(gè)回文數(shù)坯沪。
示例 4:
輸入:x = -101
輸出:false
提示:
-231 <= x <= 231 - 1
解題思路
1绿映、數(shù)組從左到右,從右到左腐晾,同時(shí)比較叉弦,如果數(shù)值不同返回false
第一種
class Solution {
public boolean isPalindrome(int x) {
char []arr=String.valueOf(x).toCharArray();
int len = arr.length;
if(len == 1)return true;
int left = 0, right= len-1;
boolean flag = true;
while(left<=right){
if(arr[left]!=arr[right]){
flag = false;
}
left++;
right--;
}
return flag;
}
}
第二種,結(jié)合其他人優(yōu)秀的解題思路藻糖,(不將整數(shù)轉(zhuǎn)為字符串來解決)這樣耗費(fèi)時(shí)間和內(nèi)存淹冰,我第一種方法運(yùn)行結(jié)果是10ms
解題思路
1、首先巨柒,我們應(yīng)該處理一些臨界情況樱拴。所有負(fù)數(shù)都不可能是回文凝颇,例如:-123 不是回文,因?yàn)?- 不等于 3疹鳄。所以我們可以對(duì)所有負(fù)數(shù)返回 false拧略。除了 0 以外,所有個(gè)位是 0 的數(shù)字不可能是回文瘪弓,因?yàn)樽罡呶徊坏扔?0垫蛆。所以我們可以對(duì)所有大于 0 且個(gè)位是 0 的數(shù)字返回 false。
現(xiàn)在腺怯,讓我們來考慮如何反轉(zhuǎn)后半部分的數(shù)字袱饭。
2、對(duì)于數(shù)字 1221呛占,如果執(zhí)行 1221 % 10虑乖,我們將得到最后一位數(shù)字 1,要得到倒數(shù)第二位數(shù)字晾虑,我們可以先通過除以 10 把最后一位數(shù)字從 1221 中移除疹味,1221 / 10 = 122,再求出上一步結(jié)果除以 10 的余數(shù)帜篇,122 % 10 = 2糙捺,就可以得到倒數(shù)第二位數(shù)字。如果我們把最后一位數(shù)字乘以 10笙隙,再加上倒數(shù)第二位數(shù)字洪灯,1 * 10 + 2 = 12,就得到了我們想要的反轉(zhuǎn)后的數(shù)字竟痰。如果繼續(xù)這個(gè)過程签钩,我們將得到更多位數(shù)的反轉(zhuǎn)數(shù)字。
3坏快、現(xiàn)在的問題是铅檩,我們?nèi)绾沃婪崔D(zhuǎn)數(shù)字的位數(shù)已經(jīng)達(dá)到原始數(shù)字位數(shù)的一半?
由于整個(gè)過程我們不斷將原始數(shù)字除以 10假消,然后給反轉(zhuǎn)后的數(shù)字乘上 10柠并,所以岭接,當(dāng)原始數(shù)字小于或等于反轉(zhuǎn)后的數(shù)字時(shí)富拗,就意味著我們已經(jīng)處理了一半位數(shù)的數(shù)字了。
class Solution {
public boolean isPalindrome(int x) {
// 特殊情況:
// 如上所述鸣戴,當(dāng) x < 0 時(shí)啃沪,x 不是回文數(shù)。
// 同樣地窄锅,如果數(shù)字的最后一位是 0创千,為了使該數(shù)字為回文缰雇,
// 則其第一位數(shù)字也應(yīng)該是 0
// 只有 0 滿足這一屬性
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
// 當(dāng)數(shù)字長度為奇數(shù)時(shí),我們可以通過 revertedNumber/10 去除處于中位的數(shù)字追驴。
// 例如械哟,當(dāng)輸入為 12321 時(shí),在 while 循環(huán)的末尾我們可以得到 x = 12殿雪,revertedNumber = 123暇咆,
// 由于處于中位的數(shù)字不影響回文(它總是與自己相等),所以我們可以簡單地將其去除丙曙。
//偶數(shù)x == revertedNumber 奇數(shù) x == revertedNumber / 10
return x == revertedNumber || x == revertedNumber / 10;
}
}