# 9. 回文数

# 题目

难度 ⭐

原题 (opens new window)

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

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true
1
2

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
1
2
3

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
1
2
3

示例 4:

输入:x = -101
输出:false
1
2

提示:

  • -231 <= x <= 231 - 1   进阶:你能不将整数转为字符串来解决这个问题吗?

#

# 解法一

  • 转换为字符串,再转成数组,再翻转比较。(没有体现算法 - - )
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  let str = x + '';
  let reverse = str.split('').reverse().join('');
  return str === reverse;
};
1
2
3
4
5
6
7
8
9

# 解法二

  • 先处理临界情况,负数不是回文;个位数为 0 的因为反转后最高位不可能是 0 ,所以不是回文。单个数字的是回文,所以 0 是回文。再用除以 10 取余的方式,反转一半的数字进行比较,反转数字大于等于原始一半数据的时候停止。
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  if (x < 0 || (x > 0 && x % 10 ===0)){
    return false
  }

  let revert = 0;
  while (revert < x){
    revert = revert * 10 + x % 10;
    x = Math.floor(x / 10);
  }

  return x === revert || Math.floor(revert / 10) === x;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

复杂度分析

  • 时间复杂度:O(log n),因为每次迭代会将输入除以 10
  • 空间复杂度:O(1),因为只需要常数空间存放若干变量;

数字反转

上次更新: 5/28/2021, 2:21:01 PM