题目地址: 回文数
题目内容:
给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。
回文数
是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121是回文,而123不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为-121。从右向左读, 为121-。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为01。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
进阶:你能不将整数转为字符串来解决这个问题吗?
思路:
将数字转为字符串后,可以使用验证
回文字符串
的思路来解决该题
代码实现:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
const str = `${x}`
if(str.length === 1) return true
let left = 0,
right = str.length - 1
while(left < right) {
if(str[left] !== str[right]) return false
left++
right--
}
return true
};
思路:
我们可以对数字进行反转计算,算出数字反转后的值,当反转到一半时,就和前面的数字相等了,
计算反转后的值可以一位一位进行计算,从原数字的最后一位开始,获取原数字最后一位可以
将原数字对10进行取余
,然后加上反转后的数字乘以10
而每次计算过反转数字后,将
原数字除以10向下取整
最后有两种情况:
如果数字位数是
偶数
,那么反转数字等于处理后的原数字
,如果数字位数是
奇数
,那么反转数字/10并向下取整
就等于处理后的原数字
代码实现:
var isPalindrome = function(x) {
// 负数和末尾为0的非0数不是回文数
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)
};