题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数
解题思路
解法一 字符串反转法
负数肯定不是回文数,我们只需要将给定的数转换为字符串然后进行反转对比即可。
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x<0){
return false;
}else if(String.prototype.split.call(x,'').reverse().join('')!= x){
return false;
}
return true;
}
解法二 双指针夹逼法
将数字转换为字符串,然后在首位布置两个指针,循环判断,夹逼即可。
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
let str = x.toString();
let n = str.length;
let left = 0;
let right = n-1;
while(left < right){
if(str[left++] != str[right--]){
return false;
}
}
return true;
}
解法三 数学解法
使用除法和求余获得对应位置的数字。
- 首先获取当前的数量级
n
,公式为n=10log10x,例如,x = 24,n=10
;x = 6234,n = 1000
- 通过
x / n
获取首位 - 通过
x % 10
获取末位 ( x % n ) / 10
去除首位和末位,x 位数减2.- x 位数减2,故每次循环需要重新计算,
n /= 100
每次比较首位和末位即可
x | n | x / n | x % n |
---|---|---|---|
123521 | 100000 | 1 | 1 |
2352 | 1000 | 2 | 2 |
35 | 10 | 3 | 5 |
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
if (x < 0) return false;
if (x < 10) return true;
let n = 10 ** Math.floor(Math.log10(x));
while (n > 1 && x > 0) {
if (Math.floor(x / n) !== x % 10) return false;
x = Math.floor((x % n) / 10);
n /= 100;
}
return true;
};