SakuraSnow's blog SakuraSnow's blog
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

SakuraSnow

一只前端咸鱼
首页
  • JavaScript
  • TypeScript
  • Vue
  • React
  • Git
  • Node
  • Linux
  • 技术文档
  • 博客搭建
  • 数据结构
  • leetcode
  • 关于
  • 友链
  • 收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据结构

  • Leetcode

    • 001-Two Sum[两数之和]
    • 002-Add Two Numbers[两数相加].md
    • 003-Longest Substring Without Repeating Characters[无重复字符的最长子串]
    • 004-Reverse-integer[整数反转]
    • 008-String to Integer (atoi)[字符串转整数]
    • 009-Palindrome Number[回文数]
    • 算法
    • Leetcode
    SakuraSnow
    2022-03-10

    009-Palindrome Number[回文数]

    # 题目

    Given an integer x, return true if x is palindrome integer.

    An integer is a palindrome when it reads the same backward as forward.

    • For example, 121 is a palindrome while 123 is not.

    # example

    Input: x = 121
    Output: true
    Explanation: 121 reads as 121 from left to right and from right to left.
    
    1
    2
    3
    Input: x = -121
    Output: false
    Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.Input: x = 123
    Output: 321
    
    1
    2
    3
    4
    Input: x = 10
    Output: false
    Explanation: Reads 01 from right to left. Therefore it is not a palindrome.Input: x = -123
    Output: -321
    
    1
    2
    3
    4

    Follow up: Could you solve it without converting the integer to a string?

    # 我的思路

    第一感觉是双指针

    第二感觉是,转成字符串反转比较即可,比较省代码

    function isPalindrome(x: number): boolean {
        let s: string = String(x);
        return s.split("").reverse().join("") == s;
    };
    
    1
    2
    3
    4

    # 最优解

    如果不能转成字符串的话,可以直接反转数字本身,如果它们是相同的,那么这个数字就是回文。

    但是,如果反转后的数字大于int.MAX,就有可能导致整数溢出。

    所以可以只反转数字的一半,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

    比如

    输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。
    
    1
    输入 12021,我们可以将数字 “12021” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 12021 是回文。
    
    1

    对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。

    那么如何知道反转数字的位数已经达到原始数字位数的一半呢?

    由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。

    所以,解法如下

    var isPalindrome = function(x: number): boolean {
        // 特殊情况:
        // 如上所述,当 x < 0 时,x 不是回文数。
        // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
        // 则其第一位数字也应该是 0
        // 只有 0 满足这一属性
        if (x < 0 || (x % 10 === 0 && x !== 0)) {
            return false;
        }
    
        let revertedNumber: number = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x = Math.floor(x / 10);
        }
    
        // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
        // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
        // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
        return x === revertedNumber || x === Math.floor(revertedNumber / 10);
    };
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #算法#Leetcode
    上次更新: 2022/03/10, 13:44:32
    008-String to Integer (atoi)[字符串转整数]

    ← 008-String to Integer (atoi)[字符串转整数]

    最近更新
    01
    008-String to Integer (atoi)[字符串转整数]
    03-10
    02
    004-Reverse-integer[整数反转]
    03-09
    03
    003-Longest Substring Without Repeating Characters[无重复字符的最长子串]
    03-09
    更多文章>
    Theme by Vdoing | Copyright © 2019-2022 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×