1 题目描述
2 题目分析
这是一道之前刷过题目,但是明显我没有掌握.
LeetCode的题目不是用来划对勾的
你只有愿意去思考,你才能够有所收获.
通过题干我们可以获得以下信息:
- 负数一定不是回文数
- 10的倍数一定不是回文数
- 回文数的关于某个值对称.有两种情况.第一种情况是x共有奇数位第二种情况是x共有偶数位.
- 以1221为例,我们建立一个变量来存储1221逆序的值.如果和x除去前 [ n / 2 ] [n/2] [n/2]位的值相同,那么说明121是一个回文数.
result = 0
result = result * 10 +x % 10 ----(result = 1)
x = x / 10 -----------------------------(x = 122)
result = result * 10 + x % 10-----(result = 12)
x = x / 10------------------------------(x = 12)
此时x == result,说明x是一个回文数
那如果x是奇数位怎么办?因为最后的时候 x = x / 10
这样会导致result多向右移动了一位并且个位是多余的.
x = 121 为例,如果不做任何处理的话是错误的.
最终x = 1, result = 12
所以我们只最要 result / 10 就行
3 代码实现
bool isPalindrome(int x)
{
if(x < 0 || x % 10 == 0 && x != 0) return false;
int result = 0;
// 目的是让result存储x一半的位数
while(result < x)
{
result = result * 10 + x % 10;
x = x / 10;
}
// 如果符合条件即为真,否则为假
if(result == x || x == (result / 10)) return true;
else return false;
}