Skip to content

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

这是经典的回文串判定问题。常见思路有:

  1. 双指针法 从字符串首尾同时向中间比较。
  2. 队列(deque)法 使用双端队列,从两端依次弹出比较。
  3. 直接翻转字符串 判断 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;
}