回文数

128 阅读2分钟

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

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

例如,121 是回文,而 123 不是。

示例 1: 输入:x = 121 输出:true

示例 2: 输入:x = -121 输出:false

解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 示例 3: 输入:x = 10 输出:false 解释:从右向左读, 为 01 。因此它不是一个回文数。 提示: -231 <= x <= 231 - 1

function isPalindrome(x: number): boolean {
    // 处理边界情况,直接返回结果
    if (x < 0 || (x % 10 === 0 && x !== 0)) {
        return false;
    }
    if (x >= 0 && x < 10) {
        return true;  // 0-9 都是回文
    }

    let reversedHalf = 0;
    while (x > reversedHalf) {
        reversedHalf = reversedHalf * 10 + x % 10;
        x = Math.floor(x / 10);
    }
    
    // 对半长度的数字进行比较,包括奇数长度的中间数字通过除以10去除
    return x === reversedHalf || x === Math.floor(reversedHalf / 10);
}


让我们用一个具体的例子来详细说明这个算法的工作原理,这样可能会更容易理解。

假设我们的输入数字是 1221,我们想判断它是否是一个回文数。回文数意味着数字正读和反读都是相同的。

算法步骤

初始状态

  • x = 1221
  • reversedHalf = 0

第一步

  • x 的最后一位:1221 % 10 = 1
  • 更新 reversedHalf0 * 10 + 1 = 1
  • 减少 x 的位数:Math.floor(1221 / 10) = 122

此时状态变为:

  • x = 122
  • reversedHalf = 1

第二步

  • x 的最后一位:122 % 10 = 2
  • 更新 reversedHalf1 * 10 + 2 = 12
  • 减少 x 的位数:Math.floor(122 / 10) = 12

此时状态变为:

  • x = 12
  • reversedHalf = 12

在这个点上,我们注意到 x(12)不再大于 reversedHalf(12),循环结束。

结果判断

对于偶数长度的数字(如 1221 是四位数字),当循环结束时,如果 xreversedHalf 相等,这意味着数字是回文的。在我们的例子中,xreversedHalf 都是 12,所以我们可以得出 1221 是一个回文数。

算法优势

这种算法的优势在于:

  1. 不需要字符串转换:它直接在数字上操作,不涉及字符串操作,这在某些编程环境中可能更有效率。
  2. 只处理一半的数字:它只需处理数字的一半就可以确定答案,这在数字很大时特别有用。