题目描述
判断一个整数的字符串表示是否是回文串。
提示:
- 负数因为负号的存在,不是回文串;
- 如果用Reverse Integer 题目中的做法,需要避免整数溢出的问题;
算法
(循环) $O(1)$
我们可以借鉴Reverse Integer题目的做法,一个正整数的字符串表示是回文串,当且仅当它的逆序和它本身相等。
但如果直接这么做,会存在整数溢出的问题,比如1111111119的逆序是9111111111(大于INT_MAX
)。
所以我们要对其改进:我们只需先算出后一半的逆序值,再判断是否和前一半相等即可。
时间复杂度分析:int型整数在十进制表示下最多有10位,对于每一位的计算是常数级的,因此总时间复杂度是 $O(1)$。
C++ 代码
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0 || x && x % 10 == 0) return false;
int s = 0;
while (s <= x)
{
s = s * 10 + x % 10;
if (s == x || s == x / 10) return true; // 分别处理整数长度是奇数或者偶数的情况
x /= 10;
}
return false;
}
};
思路妙啊,实现起来也很妙
为了避免溢出不能直接定义一个 长整型吗 这样直接反转就可以了
那也无法完全避免溢出啊
为啥无法避免啊,给个他那个x是Int的,再怎么翻转也大不过long
溢出的情况是不是都不是回文?
是的,回文的话应该和原数完全一样,不可能一个溢出一个不溢出,计算过程中溢出直接返回false就可以了。打卡代码可以过的。
妙呀。 没有想到边生成边判断的方法
加油hh
我理解做这种题的时候,是不允许直接使用数转字符串的函数的。
库函数把数字转化成字符串的原理和我们的做法差不多,这类题考察的就是这个原理,所以最好不要直接调用库函数hh
转换成字符串判断的话会不会被面试官打?
当然是内存和时间越短越好hh
尽力而为吧
我能说我是通信专业的嘛,表示没学过数据结构,只能凭自己想法来写
哈哈加油!
x && x % 10 == 0这个是把非零但末尾是零的元素去掉吗?如果不要会遗漏什么case啊
因为后面是用int存储的逆序之后的数字,所以无法知道有多少个前导零。但如果末尾没有前导零的话,后面的代码都可以处理,所以只要把末尾是0的数特判掉就可以了。
发现这个最简单。。。。。