E04067: 回文数字(Palindrome Number)
two pointers, queue, http://cs101.openjudge.cn/pctbook/E04067/
给出一系列非负整数,判断是否是一个回文数。回文数指的是正着写和倒着写相等的数。
输入
若干行,每行是一个非负整数(不超过99999999)
输出
对每行输入,如果其是一个回文数,输出YES。否则输出NO。
样例输入
11
123
0
14277241
67945497样例输出
YES
NO
YES
YES
NO这是经典的回文串判定问题。常见思路有:
- 双指针法 从字符串首尾同时向中间比较。
- 队列(deque)法 使用双端队列,从两端依次弹出比较。
- 直接翻转字符串 判断
s == reversed(s)。
同时,本题需要处理不定行输入,在 C++ 中常用 while (cin >> s) 来逐行读取。
双指针法
cpp
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome(const string &s) {
int front = 0, back = s.size() - 1;
while (front < back) {
if (s[front] != s[back]) return false;
front++;
back--;
}
return true;
}
int main() {
string s;
while (cin >> s) { // 处理不定行输入
cout << (isPalindrome(s) ? "YES" : "NO") << endl;
}
return 0;
}使用 deque 模拟双端队列
cpp
#include <iostream>
#include <string>
#include <deque>
using namespace std;
string isPalindrome(const string &s) {
deque<char> dq(s.begin(), s.end());
while (dq.size() > 1) {
if (dq.front() != dq.back()) return "NO";
dq.pop_front();
dq.pop_back();
}
return "YES";
}
int main() {
string s;
while (cin >> s) {
cout << isPalindrome(s) << endl;
}
return 0;
}直接反转字符串
cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s;
while (cin >> s) {
string rev = s;
reverse(rev.begin(), rev.end());
cout << (s == rev ? "YES" : "NO") << endl;
}
return 0;
}