题目概述
- 题目:第九题
- 难易:简单
- 内容:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121输出: true
示例 2:
输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/palindrome-number
第一次思路
将数字分为四组:小于0;0-9;大于9;溢出部分。
- 如果小于0,一定不是回文数,比如:-121 从右向左为121-,不是同一个数字
- 如果0-9,回文数一定是它本身,所以返回true;
- 溢出部分返回false
- 如果大于9,则需要进行判断。根据第七题整数反转,求出反转后的整数,然后二者进行比较
Code
class Solution {
public:
bool isPalindrome(int x) {
long y=0,t;
t=x;
if(x<0){
return false;
}
else if(x>=0&&x<10){
x=2;
}
else {while(x){
y=y*10;
if(y<=INT_MIN||y>=INT_MAX)
return false;
y=y+x%10;
x=x/10;
};
if(y==t){
x=2;
}else
return false;
}
return x==2 ;
}
};
测试 Submit
分析、 改进
如果对整数进行全部反转,需要考虑溢出问题,而且做了不必要的工作。只需要翻转一部分即可完成对比。
当数字长度为奇数时,我们可以通过y / 10,去除处于中间位置的数字。
比如:当输x=23432时,反转后的y=234,此时y/10,得到23,比较y和修改后的x是否相等,相等即为回文数
改进Code
class Solution {
public bool IsPalindrome(int x) {
if(x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
int y = 0;
while(x > y) {
y = y * 10 + x % 10;
x /= 10;
}
return x == y || x == y/10;
}
};
改进Submit
执行时间:12ms;
内存消耗:8.1MB
收获总结
考虑问题不只有一种方法,要多方面考虑,要简化问题。