題目來源於 LeetCode 第 9 號問題:迴文數。題目難度爲 Easy,目前經過率爲 56.0%。java
判斷一個整數是不是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是同樣的整數。數組
示例 1:bash
輸入: 121
輸出: true
複製代碼
示例 2:動畫
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。所以它不是一個迴文數。
複製代碼
示例 3:ui
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。所以它不是一個迴文數。
複製代碼
進階:spa
你能不將整數轉爲字符串來解決這個問題嗎?code
最好理解的一種解法就是先將 整數轉爲字符串 ,而後將字符串分割爲數組,只須要循環數組的一半長度進行判斷對應元素是否相等便可。cdn
///簡單粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
return (x + "").equals(reversedStr);
}
}
複製代碼
經過取整和取餘操做獲取整數中對應的數字進行比較。blog
舉個例子:1221 這個數字。字符串
class Solution {
public boolean isPalindrome(int x) {
//邊界判斷
if (x < 0) return false;
int div = 1;
//
while (x / div >= 10) div *= 10;
while (x > 0) {
int left = x / div;
int right = x % 10;
if (left != right) return false;
x = (x % div) / 10;
div /= 100;
}
return true;
}
}
複製代碼
直觀上來看待迴文數的話,就感受像是將數字進行對摺後看可否一一對應。
因此這個解法的操做就是 取出後半段數字進行翻轉。
這裏須要注意的一個點就是因爲迴文數的位數可奇可偶,因此當它的長度是偶數時,它對摺過來應該是相等的;當它的長度是奇數時,那麼它對摺過來後,有一個的長度須要去掉一位數(除以 10 並取整)。
具體作法以下:
y = x % 10
revertNum = revertNum * 10 + y
x
是否是小於 revertNum
,當它小於的時候,說明數字已經對半或者過半了class Solution {
public boolean isPalindrome(int x) {
//思考:這裏你們能夠思考一下,爲何末尾爲 0 就能夠直接返回 false
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
}
複製代碼
致敬 LGD