1 题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
2 解法
2.1 初版
2.1.1 思路
由于题目不允许把数直接转化为字符串, 所以想到了把数的每一位转换为双向数组, 然后对头尾一点一点比较
2.1.2 代码
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
deque<int> tDeque;
while (x) {
tDeque.push_back(x % 10);
x /= 10;
}
while (tDeque.size() > 1) {
int front = tDeque.front();
int back = tDeque.back();
if (front == back) {
tDeque.pop_front();
tDeque.pop_back();
} else {
return false;
}
}
return true;
}
2.1.3 结果
性能属实不咋地:
2.2 第二版
2.2.1 思路
pop出来是不是费性能, 所以直接用vector, 不pop了
2.2.2 代码
bool isPalindrome(int x) {
if (x < 0) {
return false;
}
vector<int> tVec;
while (x) {
tVec.push_back(x % 10);
x /= 10;
}
int left = 0;
int right = tVec.size() - 1;
while (left < right) {
if (tVec[left] == tVec[right]) {
left ++;
right --;
} else {
return false;
}
}
return true;
}
2.2.3 结果
这还不如之前的呢......
2.3 答案解法
2.3.1 思路
只翻转一半, 也就是说如果后一半翻转之后与剩下的前一半看看是否相等.
2.3.2 代码
bool isPalindrome(int x) {
if (x < 0 || (x > 0 && x % 10 == 0)) {
return false;
}
int reverseNumber = 0;
while (reverseNumber < x) {
reverseNumber = reverseNumber * 10 + x % 10;
x /= 10;
}
if (reverseNumber > x) {
reverseNumber /= 10;
}
return (reverseNumber == x);
}
2.3.3 性能
也不咋地