LeetCode-9-回文数

Posted by 刘知安 on 2018-11-15
文章目录
  1. 描述
    1. 示例1:
    2. 示例2:
    3. 示例3:
  • 解法1 —— 转为字符串+双指针
  • 解法2 —— 反转一半数字
    1. plus
  • 描述

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

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

    解法1 —— 转为字符串+双指针

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Solution:
    def isPalindrome(self, x):
    """
    :type x: int
    :rtype: bool
    """
    str_x = str(x)

    n = len(str_x)
    # 长度为1必然是回文
    if n == 1:
    return True
    # 双指针思想
    left, right = 0, n - 1
    while str_x[left] == str_x[right]:
    left += 1
    right -= 1
    # 如果总长度是奇数,是回文串时,leftright会在同一位置
    # 如果长度是偶数,是回文串时,left会和right相差1,若left>right,也就Ok了
    if left == right or left > right:
    return True
    return False

    解法2 —— 反转一半数字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public class Solution {
    public bool IsPalindrome(int x) {
    // 特殊情况:
    // 如上所述,当 x < 0 时,x 不是回文数。
    // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
    // 则其第一位数字也应该是 0
    // 只有 0 满足这一属性
    if(x < 0 || (x % 10 == 0 && x != 0)) {
    return false;
    }

    int revertedNumber = 0;
    while(x > revertedNumber) {
    revertedNumber = revertedNumber * 10 + x % 10;
    x /= 10;
    }

    // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
    // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
    // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
    return x == revertedNumber || x == revertedNumber/10;
    }
    }

    plus

    虽然是简单题,解法2还是提高了一个很好的思路,且第二个解法更优一些,免去了开字符串额外需要的空间,不过两种都能AC