Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、 题目描述
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 例如,
121是回文,而123不是。
示例1
输入: x = 121
输出: true
示例2
输入: x = -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3
输入: x = 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
二、思路分析
思路1
暴力解法
- 判断几种情况不行,负数不行,尾数为0不行,只有0满足条件
- 然后转化为字符串, 切割,反转,拼接,转化number,对比
思路2
头尾取中间比较
- 判断几种情况不行,负数不行,尾数为0不行,只有0满足条件
- 定义一个新值y,作为比较值,这个比较只比较到一半的位置
- x取10的余数,得到了最后一位值,复制给新值y
- x / 10 取整,
- 现在满足条件,x>y ,继续比较
- 再次进入,x%1取余,复制给y,但是复制之前y本身应该乘以10,再加上新的余数
- x/10 再次取整
- 剩下依次循环,直到x>y这个条件不满足为止
- 这里有个情况,就是这个数字的长度,如果为偶数,那刚好,两边相等,可以直接比较
- 如果长度为奇数的时候,这个时候我们就需要把y/10然后取整,再做比较
三、代码
暴力解法
let isPalindrome = function(x) {
/**
* 判断几种情况不行
* 负数不行,尾数为0不行,只有0满足条件
* */
if (x < 0 || (x%10 === 0 && x !== 0)) {
return false
}
/**
* 转化为字符串, 切割,反转,拼接,转化number,对比
* **/
let newNum = Number(x.toString().split('').reverse().join(''))
return newNum === x ? true : false
}
头尾中间比较
let isPalindrome = function(x) {
/**
* 判断几种情况不行
* 负数不行,尾数为0不行,只有0满足条件
* */
if (x < 0 || (x%10 === 0 && x !== 0)) {
return false
}
/**
* 思路: 头尾比较
* 定义一个新值y,作为比较值,这个比较只比较到一半的位置
* x取10的余数,得到了最后一位值,复制给新值y
* x / 10 取整,
* 现在满足条件,x>y ,继续比较
* 再次进入,x%1取余,复制给y,但是复制之前y本身应该乘以10,再加上新的余数
* x/10 再次取整
* 剩下依次循环,直到x>y这个条件不满足为止
*
* 这里有个情况,就是这个数字的长度,如果为偶数,那刚好,两边相等,可以直接比较
* 如果长度为奇数的时候,这个时候我们就需要把y/10然后取整,再做比较
*
* **/
let newNum = 0
while(newNum < x) {
newNum = x % 10 + newNum * 10
x = Math.floor( x / 10)
}
console.log(x, newNum)
return x === newNum || x === Math.floor(newNum / 10)
}