Skip to content

E04067: 回文数字(Palindrome Number)

two pointers, queue, http://cs101.openjudge.cn/practice/04067/

给出一系列非负整数,判断是否是一个回文数。回文数指的是正着写和倒着写相等的数。

输入

若干行,每行是一个非负整数(不超过99999999)

输出

对每行输入,如果其是一个回文数,输出YES。否则输出NO。

样例输入

11
123
0
14277241
67945497

样例输出

YES
NO
YES
YES
NO

回文串是算法题中常见的经典题型。本文介绍几种处理此类问题的思路,特别是当题目要求接收不定行输入时,可以采用多种方式实现。同时,这也是练习队列(deque)这一基础数据结构的良好机会。

处理不定行输入的常用方法

在 Python 中,处理多行输入有以下几种常见方式:

  1. 使用 try...except 捕获输入结束(如 EOFError
  2. 利用 sys.stdin 逐行读取
  3. 通过 sys.stdin.read() 一次性读取所有输入

双指针法

python
def isPalindrome(s):
    if len(s) < 1:
        return False
    if len(s) == 1:
        return True

    front = 0
    back = len(s) - 1
    while front < back:
        if s[front] != s[back]:
            return False
        else:
            front += 1
            back -= 1

    return True

while True:
    try:
        s = input()
        print('YES' if isPalindrome(s) else 'NO')
    except:
        break

使用 deque 模拟双端队列

借助 collections.deque 实现从两端同时取出字符进行比较,直观体现队列的操作特性。

python
from collections import deque

def is_palindrome(num):
    num_str = str(num)
    num_deque = deque(num_str)
    while len(num_deque) > 1:
        if num_deque.popleft() != num_deque.pop():
            return "NO"
    return "YES"

while True:
    try:
        num = int(input())
        print(is_palindrome(num))
    except EOFError:
        break

逐行读取

python
import sys

for line in sys.stdin:
    s = line.strip()
    if s == s[::-1]:
        print("YES")
    else:
        print("NO")

一次性读取所有输入

python
def is_palindrome(num: int) -> str:
    s = str(num)
    return "YES" if s == s[::-1] else "NO"

if __name__ == "__main__":
    import sys
    input = sys.stdin.read
    numbers = input().strip().split()
    for number in numbers:
        print(is_palindrome(int(number)))