第一次使用leetcode,感觉特别棒,跟着群里的人刷题。
此为刷题报告
开始
题目:
Determine whether an integer is a palindrome. Do this without extra space.
释义
判断一个整数是不是回文数
补充描述
负整数是回文吗? (即,-1)
如果你想将整数转换为字符串,请注意使用额外空间的限制。
你也可以尝试反转整数。 但是,如果您已解决了“反向整数”的问题,则知道反向整数可能会溢出。 你将如何处理这种情况?
有一个更通用的方法来解决这个问题。
思路:
首先的思路就是字符串,用string对象,迭代器很容易遍历,比较首尾字符是否相等,问题是首先将int转换成string,要经过一个函数的操作,这个函数我还没弄懂,直接从网上找的代码。群里人家说不能用string或者vector,额外空间的限制,这一点一直没搞明白
看了几篇博客,说是用%和/的方法取出每一位。注意负数不是回文数,取出每一位是没有意义的,记住回文数是从前和从后都是一个数,于是从后读数,如果和从前一样就相等。更多细节代码注释!
问题:
还有几点没搞明白
- 额外空间如何理解
- 反转整数为什么会溢出?
- 其他人家通用方法
代码
int getbit(int x)
{
int n=1;
while(x>=10)
{
x=x/10;
n*=10;
}
return n;
}
bool isPalindrome(int x)
{
int s=0,n=0,t=x;
if(x>=0)
{
n=getbit(x);
while(x>0)
{
s=s+((x%10)*n);
x=x/10;
n=n/10;
}
if(s==t)
return true;
}
return false;//待注释
}
之前犯规用字符串写的代码:
代码2:此为看了答案之后把我的代码合并成一个函数
bool isPalindrome(int x)
{
int s=0,n=1,t=x;
while(x>=10)
{
x=x/10;
n*=10;
}//求出第一位是哪个位,例如12321就是10000
x=t;//x重新赋值初始值
if(x<0) return false;//负数不是回文数,直接返回false
while(x>0)
{
s=s+((x%10)*n);
x=x/10;
n=n/10;
}//例如12321,取得最后一位乘以10000,接下来取得下一位2乘以1000,依次类推
if(s==t)//重新构造的数和之前的数相等,ture
return true;
return false;否则false
}
优秀的AC
bool isPalindrome(int x) {
if (x < 0) return false;
int div = 1;
while (x / div >= 10) {
div *= 10;
} //这个代码块很好
while (x != 0) {
int l = x / div;//取出第一位
int r = x % 10; //取出最后一位
if (l != r) return false; //对应的位置不等则不是回文数
x = (x % div) / 10;
div /= 100;
} //程序只要循环比较少的次数,比较完就去除12321变成232,确实很奇妙
return true;
}