每日一题 04|算法题-回文数

2020 年 12 月 14 日

阅读量:0

正文共 779 字,预计阅读时间 4 分钟

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

解法 1:将数字转换为字符串反转字符串

通过反转字符串来比较新旧字符串是最简单的方式。

JavaScript 解法

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function (x) {
  return String(x) === String(x).split("").reverse().join("");
};

Golang 解法

由于 Golang 没有 reverse 函数,所以稍微麻烦些。

func isPalindrome(x int) bool {
    s := strconv.Itoa(x)
    runes := []rune(s)
    for from, to := 0, len(runes)-1; from < to; from, to = from+1, to-1 {
        runes[from], runes[to] = runes[to], runes[from]
    }
    return s == string(runes)
}

解法 2:反转数字

首先来分析两种不是回文字的情况。

  1. 负数不是回文数。
  2. 当数字最后一位为 0 时,只有自身为 0 才是回文数。

其次在反转时,只需要反转一半即可,利用反转后的一半和前一半进行对比,如果相同就是回文字。

进行中间比较,就需要找到中心线。

这时会有两种情况,奇数和偶数。

奇数的中心线是中间那个数,偶数的中心线是中间两个数之间的那条线。

如果反转数为 revertedNumber,那么奇数终止循环的条件是 x < revertedNumber,偶数终止循环的条件是 x = revertedNumber。组合起来,终止循环的条件是 x <= revertedNumber。那么循环的条件就是 x > revertedNumber。

获取到反转一半的结果后,需要进行比较,此时还是要分别处理奇数和偶数。

偶数的比较是 revertedNumber == x。

奇数的比较是 revertedNumber / 10 == x。因为 revertedNumber 会比 x 多一个中间

JavaScript 解法

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function (x) {
  if (x < 0 || (x % 10 == 0 && x != 0)) return false;
  var revertedNumber = 0;
  while (x > revertedNumber) {
    revertedNumber = revertedNumber * 10 + (x % 10);
    x = x / 10;
  }
  return x === revertedNumber || x === revertedNumber / 10;
};

Golang 解法

在第一次做这种题时可能会将整个数字全部反转,再去比较两个数字是否相等。这样做更容易理解一些,但和上面的做法相比会多几次循环,性能上稍差一些。

func isPalindrome(x int) bool {
    if x < 0 || (x%10 == 0 && x != 0) {
        return false
    }
    var revertedNumber int
    oldVal := x
    for x != 0 {
        revertedNumber = revertedNumber*10 + x%10
        x = x / 10
    }
    return revertedNumber == oldVal
}

时间复杂度:O(log10(n))

空间复杂度:O(1)


你好,我是 卢振千,一名软件工程师。欢迎你来到我的网站。