判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121 输出: true
示例 2:
输入: -121 输出: false 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10 输出: false 解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
class Solution {
public:
bool isPalindrome(int x) {
//首先利用字符串流将整型数据转换为字符串
stringstream s;
s << x;
stack<char> hh;
vector<char> xx;
vector<char> yy;
for(auto c:s.str())
{
xx.push_back(c);
hh.push(c);
}
while(!hh.empty())
{
yy.push_back(hh.top());
hh.pop();
}
if(xx == yy)
return true;
else
return false;
}
};
又一次完美的超过了不到0.01
上面是利用了栈的入栈顺序和出栈顺序来判断的,既费事件又费空间
下面解法是利用reverse函数
class Solution {
public:
bool isPalindrome(int x) {
//首先利用字符串流将整型数据转换为字符串
if(x < 0)
return false;
stringstream s;
s << x;
string hh = s.str();
string xx = s.str();
reverse(xx.begin(), xx.end());
if(hh == xx)
return true;
else
return false;
}
};
果然有了进步
进阶说不转换成字符串可以吗?当然可以。
其实很简单,仅仅需要不断的取第一位和最后一位进行比较,如果相同就继续找,不满足就返回false,
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0)
return false;
int d = 1;
//得到x有多少位
while(x / d >= 10)
d *= 10;
while(x > 0)
{
int l = x / d;//最左边的数
int r = x % 10;//右边的数
if(l != r)
return false;
x = x % d / 10; //把两边给截断
d /= 100;//由于截断两位,所以d除以100
}
return true;
}
};
效果好了一小丢丢。。。