# 题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
LeetCode地址:https://leetcode-cn.com/problems/palindrome-number/
示例一🌰:
输入: 121
输出: true
示例二🌰:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例三🌰:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
# 解题思路1
这题的解题思路类似于leetcode
上的第五题《最长回文子串》, 但比那题要简单很多.
在这里还是可以使用中心扩展法
- 考虑输入的值为空的情况;
- 将数字转换为字符串, 考虑长度为
1
或者2
的情况; - 判断字符串的长度
len
是奇数还是偶数; - 获取字符串中间的那个索引
midIndex
; - 若
len
为奇数, 则从midIndex
向两边进行扩展判断; - 若
len
为偶数, 则从midIndex-1
项和midIndex
项向两边扩展判断;
# coding1
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x === null || x === undefined || x === '') return false;
x += ""
const len = x.length
if (len === 1) return true;
if (len === 2) return x[0] === x[1];
let isEven = len % 2 === 0;
let midIndex = Math.floor(len / 2); // 中间的索引
let isPalind = function (str, left, right) {
let l = left,
r = right;
while (l >= 0 && r <= str.length - 1) {
if (str[l] === str[r]) {
l--;
r++;
} else {
return false;
}
}
return true;
}
return isEven ? isPalind(x, midIndex - 1, midIndex) : isPalind(x, midIndex - 1, midIndex + 1)
};
测试代码
isPalindrome(5665)
// true
# 解题思路2
- 将数字转换为字符串,然后判断这个字符串是不是回文字符串
- 判断是不是回文字符串可以有两种:
reverse()
,while
循环。
# coding2
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (typeof x !== 'number') return false;
return String(x).split('').reverse().join('') === String(x);
};
测试代码
isPalindrome(5665) // true
isPalindrome(-121) // false
# 解题思路3
和解题思路2一样,不过换一种判断回文字符串的方式。
- 定义一个指针
i
和另一个指针j
,分别从头和从尾移动 - 移动时比较这两个位置上的字符串是否相等
- 若不相等则直接返回
false
,否则两个指针继续移动。
# coding3
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (typeof x !== 'number') return false;
let str = String(x);
let i = 0, j = str.length - 1;
while (i < j) {
if(str.charAt(i) !== str.charAt(j)) return false;
i++;
j--;
}
return true;
};
阅读全文