LeetCode系列记录我学习算法的过程。
持续创作,加速成长!这是我参与「掘金日新计划 6 月更文挑战」的第 9 天,点击查看活动详情
题目
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例:
输入: x = -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
输入: x = 121
输出: true
输入: x = 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
提示
-231 <= x <= 231 - 1- 你能不将整数转为字符串来解决这个问题吗?
思路
这个题目刚开始我是打算将其转为字符串,然后通过两个指针从两边移动到中间,期间如果指向的数字不相同,则返回 false
但是又给了个提示希望可以不转为字符串来解决,那只能考虑其他方法了
既然回文数是正序和倒序读都一样的整数,那么我们首先就可以把负数直接排除掉,然后小于 10 的也可以直接判定为 true
剩下的我们可以用到之前 整数反转 里的方法,先将整数反转,然后与原数比较,相同则返回 true
代码实现
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 小于 0 直接返回 false
if (x < 0) return false
// 0 ~ 9 返回 true
if (x < 10) return true
// result 用来存储反转后的整数
let result = 0, temp = x
while(temp !== 0) {
result = result * 10 + temp % 10
temp = (temp / 10) | 0
}
// 最后返回是否相等
return result === x
};
果然刷题是有好处的,一下子就给用上了
优化
看了题解,有个方法是取出整数的头尾数字进行判断,不相等则返回 false ,否则取下一组头尾数字,直至全部取完
刚开始我也想到了这种方法,但是没有想到如何取出头部的数字,所以就没有用这种方法,没想到在题解里看到了
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 小于 0 直接返回 false
if (x < 0) return false
// 0 ~ 9 返回 true
if (x < 10) return true
// 获取 x 的量级 例 1931 -> 1000
let n = 10 ** Math.floor(Math.log10(x));
while (n > 1 && x > 0) {
// 如果头尾数字不同 返回 false
if (Math.floor(x / n) !== x % 10) return false;
// 将头尾数字去掉
x = Math.floor((x % n) / 10);
// 数量级下降两位
n /= 100;
}
return true;
};