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 中,处理多行输入有以下几种常见方式:
- 使用
try...except捕获输入结束(如EOFError) - 利用
sys.stdin逐行读取 - 通过
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)))