判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀起來都是一樣的整數。
示例1:
輸入: 121
輸出: true
示例2:
輸入: -121
輸出: false
解釋:從左向右讀,為-121。從右向左讀,為121-。因此它不是一個回文數。
示例3:
輸入: 10
輸出: false
解釋:從右向左讀,為01。因此它不是一個回文數。
方法一:普通解法
思路
將整數轉換為字符串,然后將字符串分割成數組,循環數組的一半長度進行判斷對應元素是否相等即可。
方法一:代碼
///簡單粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
//當x小于0和尾數為0的時候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
//x+""是將整數轉字符串,reverse()是字符串反轉
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
//將x+""字符串和reversedStr字符串進行對比,相等返回true,不相等返回false
return (x + "").equals(reversedStr);
}
}
方法二:進階解法-數學解法
通過取整和取余操作獲取整數中對應的數字進行比較。
舉個例子:1221這個數字。
-
通過計算1221/1000,得到首位1;
-
通過計算1221%10,得到末位1;
-
進行比較;
-
再將百位2和十位2取出繼續比較。
方法二:代碼
class Solution {
public boolean isPalindrome(int x) {
//當x小于0和尾數為0的時候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int div = 1;
//用while循環計算出最大的div,如1221可計算div=1000
while (x / div >= 10) {
div *= 10;
}
while (x > 0) {
//得到最左邊的數字如left=1221/1000=1
int left = x / div;
//得到最右邊的數字如right=1221%10=1
int right = x % 10;
//進行判斷如果此時左右兩邊數不相等直接返回false
if (left != right) {
return false;
}
//然后獲取剩下的數字,1221%1000=221,221/10=22。x現在為22
x = (x % div) / 10;
//x縮短兩位數,所以div要除以100也縮短兩位數。
div /= 100;
}
return true;
}
}
方法三:進階解法-巧妙解法
這個方法就是取出后半段數字進行翻轉,然后在和原來前半段數字進行對比。
注意
回文數可奇可偶,如果偶數長度直接取半。如果奇數取半的同時要/10取整。
做法如下:
-
每次進行取余操作%10,取出最低的數字:y=x%10;
-
將最低的數字加到取出數的末尾:revertNum=revertNum*10+y;
-
每取一個最低數字,x都要自除以10;
-
判斷x是不是小于revertNum,當它小于的時候,說明數字已經對半或者過半了;
-
最后,判斷奇偶情況:如果是偶數的話,revertNum和x相等;如果是奇數的話,最中間的數字就在revertNum的最低位上,將它除以10以后應該和x相等。
方法三:代碼
class Solution {
public boolean isPalindrome(int x) {
//當x小于0和尾數為0的時候直接可以false
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int revertedNumber = 0;
//1.判斷x是否大于revertedNumber,假設x為12321
while (x > revertedNumber) {
//2.將x最后一位取出,并反轉反轉放入revertedNumber中,revertedNumber=0*10+12321%10=0+1=1
//4.revertedNumber=1*10+1232%10=10+2=12
//5.revertedNumber=12*10+123%10=120+3=123
revertedNumber = revertedNumber * 10 + x % 10;
//3.將x縮短一位x現在為1232,繼續循環判斷x是否大于revertedNumber
//5.x=123,再次判斷
//6.x=12,不滿足x>revertedNumber循環結束。
x /= 10;
}
//因為x為奇數所以要去掉revertedNumber中的最后一位數在進行對比。
return x == revertedNumber || x == revertedNumber / 10;
}
}
作者:MisterBooo 鏈接:https://leetcode-cn.com/problems/palindrome-number/solution/dong-hua-hui-wen-shu-de-san-chong-jie-fa-fa-jie-ch/ 來源:力扣(LeetCode)
浙公網安備 33010602011771號