leetcode 刷题记:9. 回文数

刚一看题目,我还以为是回族文字,然而并不是,意思是正读和反读都相同的字符序列。

有趣的是,回文也是一种汉语语法。看下面就知道是什么了:

1
2
空花落尽酒倾缸,日上山融雪涨江。
红培浅瓯新火活,龙团小碾斗晴窗。

反过来读:

1
2
窗晴斗碾小团龙,活火新瓯浅焙红。
江涨雪融山上日,缸倾酒尽落花空。

偏题了,来看看题目

问题描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

1
2
3
4
5
// @title palindrome-number
// @test(121)=true
// @test(-121)=false
// @test(10)=false
// @test(-101)=false

解题思路

还是和第七题一样,可以把数字转字符串,再进行操作。

方法一

既然是回文数,那只要使用下面的方法反转字符串,然后和之前的对比,两者相等就是回文了。

代码

1
2
3
4
5
6
7
8
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
x += "";
return x.split("").reverse().join("") === x;
};

方法二

这样写算法题像是作弊?而且用这么多内置方法,大概会被问怎么实现reverse()。那用遍历吧。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
x += "";
const newString = [];

for (let i = x.length - 1, j = 0; i >= 0; i--, j++) {
newString[j] = x[i];
};

return x === newString.join("");
};

方法三

还有没有更 hack 的方法?前面第 n 位与倒数第 n 位对比,完全相同也可证明是回文数。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* @param {number} x
* @return {boolean}
*/
const isPalindrome = function(x) {
x += "";
let len = x.length - 1;
let i = 0;
while (i < len) {
if (x[i++] !== x[len--]) return false;
}
return true;
};

这里巧妙的避开了数字长度是单数和双数的问题,因为后指针(下标)不会和前指针(下标)相同。


leetcode 刷题记:9. 回文数
https://bubao.github.io/posts/34b3ee0f.html
作者
一念
发布于
2021年3月22日
许可协议