题目描述
回文数是指正着读和倒着读都一样的整数。例如,121是回文数,而123不是回文数。本问题要求判断一个整数是否为回文数。
输入格式
输入共 1 行,包含一个整数 x。
输出格式
输出共 1 行,如果 x 是回文数,输出 “true”;否则输出 “false”。
数据范围
-2^31 ≤ x ≤ 2^31 - 1
输入样例1:
输出样例1:
输入样例2:
输出样例2:
输入样例3:
输出样例3:
注意事项
- 负数不是回文数,因为负号在倒过来之后会变成数字的一部分,改变了数字的意义。
- 可以通过将整数转换为字符串来判断是否为回文数,也可以通过数学方法直接反转整数来判断。
- 在反转整数时,需要注意避免整数溢出的问题。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <iostream> using namespace std;
bool isPalindromeString(int x) { if (x < 0) { return false; } string s = to_string(x); int left = 0; int right = s.length() - 1; while (left < right) { if (s[left] != s[right]) { return false; } left++; right--; } return true; }
bool isPalindromeMath(int x) { if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } int reversedNumber = 0; while (x > reversedNumber) { reversedNumber = reversedNumber * 10 + x % 10; x /= 10; } return x == reversedNumber || x == reversedNumber / 10; }
int main() { int x; cin >> x; bool result = isPalindromeMath(x); if (result) { cout << "true" << endl; } else { cout << "false" << endl; } return 0; }
|
时间复杂度
- 时间复杂度:O(logx),其中 x 是输入的整数,logx 是 x 的位数。
- 空间复杂度:O(1)(数学方法)或 O(logx)(字符串方法,用于存储字符串)。
代码解释
- 判断回文数有两种常见的方法:将整数转换为字符串进行判断,或者使用数学方法直接反转整数进行比较。
- 字符串方法的思想很简单:将整数转换为字符串后,从两端向中间比较字符是否相同。
- 数学方法的思想是:通过取模和除法运算,将整数的后半部分反转,然后与前半部分进行比较。这种方法可以避免整数溢出的问题,因为我们只反转一半数字。
- 对于数学方法,我们需要处理一些特殊情况:负数不是回文数;如果数字的最后一位是0,那么只有当数字本身是0时才是回文数。
- 当数字长度为奇数时,反转后的数字会比原数字多一位,这时需要通过除以10来去除中间位。