这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战
题目描述
给一个整数,判断它是不是回文数,如果是则返回true, 否则返回false。
补充一下什么是回文数?
就是这个整数正着读和反着读,是一样的数字。
比如说1221, 正着读是1221,反着渎也是1221,这个就是回文数。
121, 正着读是121,反着渎也是121,这个就是回文数。
1122, 正着读是1122,反着渎是2211,这个就不是回文数。
思路描述
第一种方法
因为数字不能直接遍历,这里先把数字转成字符串,然后再进行遍历。
遍历的时候,首尾进行判断是否相等,如果不等则直接返回false。
如果相等则直接继续下个遍历,直到首的索引大于或者等于尾的索引的时候,就可以证明是回文数了。
代码如下:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
x = x.toString()
const len = x.length
for (let i = 0; i < len; i++) {
if (i >= len - i - 1) return true
if (x[i] === x[len - i - 1]) continue
else return false
}
};
那么继续来个有难度的,能不能不转成字符串来判断是回文数?
答案是可以的。
第二种方法
不转成字符串,那么就不能进行遍历来判断(数字没有length,不能直接遍历)。那么就得把数字翻转过来,然后来判断相不相等,相等则就是回文数。
那么该怎么把数字翻转过来?
比如:58,翻转过来就是85。
它其实等于 ((0 * 10 + 8) * 10 + 5),等同于 (8 * 10 + 5)
比如:123,翻转过来就是321。
它其实等于 (((0 * 10 + 3) * 10 + 2) * 10 + 1),等于 ((3 * 10 + 2) * 10 + 1)
比如:1372,翻转过来就是2731。
它其实等于 ((((0 * 10 + 2) * 10 + 7) * 10 + 3) * 10 + 1),等于 (((2 * 10 + 7) * 10 + 3) * 10 + 1)
从这里的规律可以看出,主要是取最后一个数,乘以10,接着取倒数第二个,二者相加后乘以10,然后取倒数第三个,二者相加后乘以10,以此类推,直至第一个数。
翻转后判断和原来的数是否相等即可。
代码如下:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function (x) {
let n = x
let reserveNum = 0
while (n > 0) {
reserveNum = reserveNum * 10 + n % 10
n = (n - n % 10) / 10 // 取余数,也可以使用 n = parseInt(n/10)
}
return reserveNum === x
};
这个方法主要是知道怎么把数字翻转,这个理解比较晦涩,大家可以动手敲敲试试。