題目說明
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 爲 -121 。 從右向左讀, 爲 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 爲 01 。因此它不是一個迴文數。
進階:
你能不將整數轉爲字符串來解決這個問題嗎?
解題思路一(字符串反轉)
- 第一反應數字轉字符串,然後前後對比。可以解決問題。
代碼實現一
var isPalindrome = function(x) {
let xStr = x + '';
let mid = +(xStr.length >> 1) + (+xStr.length % 2);
for (let i = 0; i < mid; i++) {
if (xStr.charAt(i) != xStr.charAt(xStr.length - i - 1)) {
return false
}
}
return true;
};
解題思路二(求得x的位數,xLen = Math.log10(x))
- 求得長度,接下來跟字符串一樣了。
- parseInt(x / Math.pow(10, xLen)) 得到首位
- x % 10 得到尾位
- 對比是否相等
代碼實現二
var isPalindrome = function(x) {
if(x < 0) {
return false
}
let xLen = parseInt(Math.log10(x));
while(x >= 1) {
if(x % 10 != parseInt(x / Math.pow(10, xLen))) {
return false
}
x = x % Math.pow(10, xLen);
x = parseInt(x /= 10);
xLen-=2;
}
return true
};
解題思路三(反轉尾部)
- 這個是官方題解,反轉尾部,直到前半部分小於等於反轉後的尾部
- 將x的尾部移出來,反轉。一直到x剩下的前半部分等於或者小於反轉的尾部。
- 前半部分小於尾部,說明到了x的中間位。
- 跳出循環時,迴文數只有兩種情況。
- 第一種,x爲偶數,直接判斷首尾是否相同。
- 第二種,x爲奇數,尾部除以10,再進行判斷。
代碼實現三
var isPalindrome = function(x) {
if(x < 0 || (x % 10 == 0 && x > 9)) {
return false
}
let xTail = 0;
let length = 0;
while(x > xTail) {
xTail *= 10;
xTail += x % 10;
x = parseInt(x / 10);
length++;
}
if (x == xTail || x == parseInt(xTail / 10)) {
return true
} else {
return false
}
};