「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
题目:
9. 回文数
给你一个整数 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
复制代码
提示:
-231 <= x <= 231 - 1
进阶: 你能不将整数转为字符串来解决这个问题吗?
暴力解法
思路
- 题目中提到
你能不将整数转为字符串来解决这个问题吗
, 说明转成字符串来解决一定很简单, 那我们先来看看转成字符串解决有多简单; - 字符串可以通过
split
切割成数组; - 数组可以通过
reverse
进行倒序; - 数组可以通过
join
拼接成字符串; - 匹配转换前的字符串和转换后的字符串是否相等。
实现:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
return String(x) === String(x).split("").reverse().join("");
};
复制代码
暴力解法数字版
思路
上面的暴力解法只是为了体验一下转成字符串有多简单,接下来我们正儿八经的开始解题。
- 由于是数字,那么负数肯定旋转后不一样, 所以小于0的淘汰;
- 尾数是0的,除了0本身,旋转后没有数字能以0开头,也淘汰;
- 每次从原数字
x
中取除最后一位, 放到result
的最后; - 比较原数字
x
和result
是否相等。
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 边界 -- 负数和尾数为0的整数
if (x < 0 || x % 10 === 0 && x !== 0) {
return false;
}
// 个位数不用翻转
if (x < 10) {
return true;
}
let result = 0;
// 找人代跑,待会儿比较用到x
let temp = x;
while (temp > 0) {
// 把当前原本值的末位放到结果的末尾
// 相当于一个个push进数组,再拿出来,完成了一次reverse
result = result * 10 + temp % 10;
temp = Math.floor(temp / 10);
}
return result === x;
};
复制代码
优化
其实我们不用比对全部数据,只需要比对前半截是否与后半截相等即可。即上述代码中的temp < result
; 然后我们需要对不同情况进行处理:
- 数字为偶数位, 这种是最简单的, 判断
temp === result
是否符合, 比如数字1221
; - 数字是奇数位, 这是
temp < result
, 比如数字12321
, 这是temp = 12, result = 123
, 我们需要处理数据result = Math.floor(result / 10)
后进行比较; - 而且我们发现我们这一次不用对
x
原数据进行比较了,所以省掉一个变量temp
直接操作原数据即可,勤俭持家。
优化代码
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
// 边界 -- 负数和尾数为0的整数
if (x < 0 || x % 10 === 0 && x !== 0) {
return false;
}
// 个位数不用翻转
if (x < 10) {
return true;
}
let result = 0;
while (x > result) {
// 把当前原本值的末位放到结果的末尾
// 相当于一个个push进数组,再拿出来,完成了一次reverse
result = result * 10 + x % 10;
x = Math.floor(x / 10);
}
return result === x || Math.floor(result / 10) === x;
};
复制代码
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。