leetcode每天一题:【回文数】(简单)

219 阅读2分钟

这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

给一个整数,判断它是不是回文数,如果是则返回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
  }
};

image.png

那么继续来个有难度的,能不能不转成字符串来判断是回文数?

答案是可以的。

第二种方法

不转成字符串,那么就不能进行遍历来判断(数字没有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
};

image.png

这个方法主要是知道怎么把数字翻转,这个理解比较晦涩,大家可以动手敲敲试试。