本人小白 接下来的用来记录我Leetcode刷题 我本人基础很差 所以选择从最简单的开始,仅仅作为记录自己刷题时的想法。
1:这个题目一看到我寻思用反转数字的方法来做,直接用数字来取余然后进行全部反转操作,也就是下面这段代码
class Solution {
public:
bool isPalindrome(int x) {
// string s1 = (string) x;
// string s2 = "";
// for(int i = s1.size()-1;i>=0;i--)
// {
// s2.push_back(s1[i]);
// }
// if(s1 == s2) return true;
// else return false;
// }
if(x<0) return false;
if(x == 0) return true;
if(x%10 == 0) return false;
//if(x == 0) return true;
long sum = 0;
// for(int i = 0;sum<=x;i++)
// {
// sum+=(x%10)*pow(10,i);
// x/=10;
// if(sum == x) return true;
// }
int Flag = x;
//while(x>sum)
while(x>0)
{
sum = sum*10+x%10;
x/=10;
}
//if(x == sum) return true;
if(sum == Flag) return true;
//sum/=10;
//if(x == sum) return true;
//x = x+sum%10;
//if(x== sum) return true;
return false;
}
}
但是程序最后显示运行超出范围,经过调试,是sum超出了范围,如果将sum改为long类型就可以运行成功,为什么会超出范围呢,经过分析,假设int类型最大可存储128个字节,然后sum如果也是反转的话,为int类型,那么就为821,超出int字节的范围,所以这是一个错误。
2:看了Leetcode上的解题,有个方法很好,就是将sum只判断一半的数字然后再和前面一半的x进行比较,这样如果sum是int类型的话就不会有溢出的情况了,但是还需要加一个判断方式,就是如果位数是奇数的话,那么中间那一位是不需要看的,一定是对称的,所以将奇数的那一位除去也行,加上也行,也就是下面这段代码
class Solution {
public:
bool isPalindrome(int x) {
// string s1 = (string) x;
// string s2 = "";
// for(int i = s1.size()-1;i>=0;i--)
// {
// s2.push_back(s1[i]);
// }
// if(s1 == s2) return true;
// else return false;
// }
if(x<0) return false;
if(x == 0) return true;
if(x%10 == 0) return false;
//if(x == 0) return true;
int sum = 0;
// for(int i = 0;sum<=x;i++)
// {
// sum+=(x%10)*pow(10,i);
// x/=10;
// if(sum == x) return true;
// }
while(x>sum)
{
sum = sum*10+x%10;
x/=10;
}
if(x == sum) return true;
sum/=10;
if(x == sum) return true;
//x = x+sum%10;
//if(x== sum) return true;
return false;
}
};
3:第三种方法就是通过C++自带的to_string函数,将int类型的数据转换为string类型,然后再进行判断,这个就不需要关心数据溢出问题,而且转换为string类型之后可以有两种解法,一种就是用两个变量,min一个存储第一位,max一个存储最后一位,如果,两个指针在不断++和--的过程中,判断是否相等,然后如果min>max了就退出循环,这是从Leetcode上看到的解题方法,本人想的是,先定义一个空字符串,然后通过一个for循环,设置i变量为string的最大长度-1,然后再用string的push_back()方法,将string的i-1存放到该空字符串中,然后判断新的字符串和原字符串是否相等。这种方法仅口头描述,不实现
4:用python的str转换可以更简单的实现,其中可以用我在网上查到的循环反向迭代法,也可以将str转换为列表,然后再用列表的reverse方法逆置,最后判断两个是否相等,例如下图。后面才发现还可以用python中的逆序操作a[::-1]然后直接读取赋值就行
class Solution:
def isPalindrome(self, x: int) -> bool:
s1 = str(x);
s2 = ""
for i in s1:
#循环反向迭代法
s2 = i + s2
if s1 == s2 :
return True
else:
return False