这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
示例 4:
输入:x = -101
输出:false
链接:leetcode-cn.com/problems/pa…
题解
- 转换为字符串。我们可以将数字转换为字符串,然后通过循环比较字符串两端的字符是否相等来判断是不是回文数。具体代码如下,时间复杂度为 O(logn)
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
const x_str = String(x)
const n = x_str.length
let l = 0
let r = n - 1
while (l < r) {
if (x_str[l] !== x_str[r]) {
return false
}
l ++
r --
}
return true
};
- 数学方式找出头和尾的数字来判断是否是回文数。具体做法就是取出最大位数上的数字和最小位数上的数字,判断是否相等,然后去头去尾成新的数字继续判断。具体代码如下,时间复杂度 O(logn)
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0) return false
let div = 1
while (Math.floor( x / div ) >= 10) {
div *= 10
}
while (x > 0) {
let r = x % 10
let l = Math.floor(x / div)
if (l !== r) return false
x = Math.floor((x % div) / 10)
div /= 100
}
return true
};
- 取出后半部分的数字和前半部分来比较,同样是通过数学的方法。最后取出的后半部分可能位数大于左半部分,所以要同时比较除以10和不除以10的部分是否相等。具体代码如下,时间复杂度 O(logn)
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if (x < 0 || (x % 10 === 0 && x !== 0)) return false;
let revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x = Math.floor(x / 10);
}
return x === revertedNumber || x === Math.floor(revertedNumber / 10);
};