题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
输入: x = 121
输出: true
输入: x = -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: x = 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
解题
function isPalindrome(x: number): boolean {
// 0 - 10 为回文数
if(x >= 0 && x < 10){
return true;
}
// 负数和被 10 整除的不为回文数
if(x < 0 || x % 10 === 0){
return false;
}
const y = String(x).split('');
// const revert = y.reverse().join('');
// // 转变为数组然后翻转判断是否相等
// return String(x) === revert;
// 优化点:不需要翻转整个数,只需要一半即可
// 不过需要区分长度为奇数还是偶数
const len = y.length;
const half = Math.floor(len / 2);
return len % 2 === 0 ?
y.slice(0, half).join('') === y.slice(half, len).reverse().join('') :
y.slice(0, half).join('') === y.slice(half + 1, len).reverse().join('');
// 一开始想着双指针遍历,但是超时
// for (let i = 0, j = len - 1;i !== j; i++, j--) {
// if (y[i] !== y[j]) {
// return false;
// }
// }
// return true;
};
理解
- 一开始可先使用最直接的暴力方式找到基本思路再对其进行优化和改造
- 对于特殊情况的数据可直接先行判断返回即可,提高效率
- 优化时尽量多方向,例如折半、递归等思路
- 看了题解后还可以利用数学角度去处理