题目:
在不使用额外的内存空间的条件下判断一个整数是否是回文。
提示:
负整数可以是回文吗?(比如-1)
如果你在考虑将数字转化为字符串的话,请注意一下不能使用额外空间的限制你可以将整数翻转。但是,如果你做过题目“Reverse Integer”,你会知道将整数翻转可能会出现溢出的情况,你怎么处理这个问题?这道题有更具普遍性的解法。
什么是回文?
例如:1221、12321等。负数不是回文,能被10整除的肯定也不是回文(除0以外)。
什么是不使用额外空间?
在网上查了一些资料:一般都是指空间复杂度为O(1)。无论代码执行了多少行,只要是没有循环等复杂结构,那这个代码的时间复杂度就都是O(1)。(这是个人理解,如果大佬恰巧路过此地,认为此处理解不当,请您留下您的高见,谢谢哦)
代码如下,详细解释已经在代码中标注
class Solution {
public:
/**
*
* @param x int整型
* @return bool布尔型
*/
bool isPalindrome(int x) {
// write code here
//查了一些资料:不使用额外空间的意思一般指空间复杂度为O(1)
//空间复杂度为O(1),相当于未使用额外空间
//我认为这个方法比下边的好很多,下边那个纯属好奇会不会成功
int temp = 0;
if (x < 0 || x != 0 && x % 10 == 0)
return false;
while (x > temp)
{
temp = temp * 10 + x % 10;
x = x / 10;
}
//当x是奇数时,最中间的数会在最后一次循环中给temp,所以temp/10去掉最后一个数,
//最后temp的值是数字的后半部分
//最后x的值是数字的前半部分
return temp == x || temp / 10 == x;
/*
if (x < 0 || x != 0 && x % 10 == 0)
return false;
string str = to_string(x);
//我还尝试了注释掉的这种方式
//可是通过率只有25%,错误原因是:有溢出
//reverse(to_string(x).begin(), to_string(x).end());
//return str == to_string(x);
//我就定义了第二个变量,通过了,此时空间复杂度也为O(1)
string temp = str;
reverse(temp.begin(),temp.end());
return temp == str;
*/
}
};