9. Palindrome Number*

​https://leetcode.com/problems/palindrome-number/description/​

题目描述

Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward.

Example 1:

Input: 121
Output: true

Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.

Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Follow up:

Coud you solve it without converting the integer to a string?

解题思路

这道题使用将数字转换为字符串可以很简单搞定. 转换为字符串之后使用对撞指针.

但是题中说了不用这种方法. 那么可以按如下步骤解决, 当然 leetcode 官方也给了解答: ​​https://leetcode.com/problems/palindrome-number/solution/​

使用数学的方法:

  1. 首先舍去一些特殊的情况, 比如​​x < 0​​ 或者 ​​x​​ 是以 0 结尾(除零之外)的整数.
  2. 判断一个正整数是否为回文的, 比如​​12321​​, 设置 ​​revertedNumber​​ 来获得从右向左读的数字, 方法是从 ​​x​​ 中不断 ​​pop​​ 出最右边的数字.

当然, 可以将 ​​x​​​ 不断除以 10 最后到 0, 然后判断 ​​revertedNumber​​​ 是否与原来的 ​​x​​​ 相等, 但此处可以让 ​​while​​​ 循环中的判断变为 ​​while (x > revertedNumber)​​​, 如果 ​​x​​​ 是回文的, 那么最后只需要判断 ​​x == revertedNumber​​​ 或者 ​​x == revertedNumber / 10​​​ 是否成立, 对于前一种情况比如 1221 这种完全对称的数字, 那么当 ​​while​​​ 循环跳出时 ​​x​​​ 和 ​​revertedNumber​​​ 都为 12; 而对于第二种情况, 比如 ​​12312​​​, ​​while​​​ 循环跳出时, ​​x​​​ 为 12, 而 ​​revertedNumber​​​ 为 123, 这样就需要判断 ​​x​​​ 是否等于 ​​revertedNumber / 10​​ 了.

C++ 实现 1

class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || (x % 10 == 0 && x != 0))
return false;

int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || (x == revertedNumber / 10);
}
};