题目描述
判断一个整数的字符串表示是否是回文串。
提示:
负数因为负号的存在,不是回文串;
如果用Reverse Integer 题目中的做法,需要避免整数溢出的问题;
思路
面对这道题,第一个想到了前文学过的回文串,可以先将数字转换位字符串,就变成了回文串的判断,在学习数字转字符串,学习了相关的函数的知识
首先推荐用用C++的stringstream。
主要原因是操作简单。
数字转字符串,int float类型 同理
#include <string>
#include <sstream>
int main(){
double a = 123.32;
string res;
stringstream ss;
ss << a;
ss >> res;//或者 res = ss.str();
return 0;
}
字符串转数字,int float类型 同理
```c
int main(){
string a = "123.32";
double res;
stringstream ss;
ss << a;
ss >> res;
return 0;
}
c++中字符串的反转
1.对于用char定义的字符串:使用string.h中的strrev函数
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[]="123456";//不能是string类型;
strrev(s);
cout<<s<<endl;
return 0;
}
2.对于string类型的:使用algorithm中的reverse函数
#include<iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
string s[]="123456";
reverse(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
class Solution {
public:
bool isPalindrome(int x) {
long res;//int翻转会溢出
if(x<0) return false;//负数必然不是,直接排除
string a = to_string(x);//转字符串
std::reverse(a.begin(),a.end());//翻转字符串
stringstream out(a);//将翻转的a的字符串读入,转化位数字,并读到res中
out>>res;
return x==res;//将翻转后数字与原数字做比较
}
};
思路2
不用字符串,用数字的方法来做,考虑到数字翻转后会存在溢出情况,因此可以只翻转后半部分,将后半部分翻转后与前一部分比较,由于数字为数存在奇书和偶数两种情况,所以可能相等,可能相差10倍
代码如下
’
class Solution {
public:
bool isPalindrome(int x) {
if(x<0||(x&&x%10==0)) return false;//当负数,非零的10的整数都排除,都不可能是回文数
int s=0;//翻转的数字
while(s<=x){
s=s*10+x%10;//从末尾往前遍历
if(x==s||s==x/10) return true;//偶数位会相同,奇数位会s==x/10,相差10倍
x=x/10;//删除位
}
return false;
}
};