每日一题,防止痴呆 = =
一、题目大意
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
二、题目思路以及AC代码
这几天因为毕设要结束的原因,老是没时间写题,今天答辩完啦,撒花,来写道题 ^_^。
思路一
本题就是一个常见的回文数问题,题目提到不要将数字转化为字符串。我一琢磨,这不是一样的吗,只要用一个栈就解决了呀,首先对于负数肯定是不符合要求的,其次0我们也可以单独处理,那么剩下的我们只要按位压栈,然后再将出栈元素与整数的每一个位比较一下就好了。这样的时间复杂度是O(logn),但会占用额外的空间,注意这里的n是那个整数,并不是指整数的长度。
思路二
另外一个就是官方解答的思路,我们可以考虑将整数的后半部分翻转,如果和前半部分一致,那不就证明是回文数了吗?我们只要按位遍历整数,然后用一个变量存储后半部分的翻转,并且当翻转数大于原数的时候停止,此时判断原数是否等于翻转数(长度为偶数)或者是否等于翻转数除以10(长度为奇数)就可以了,具体看代码吧,很容易懂。当然这种方式要注意把尾数为0的情况去掉,不然翻转数会少一位 = =。这种方法的时间复杂度同样是O(logn),但没有额外占用栈空间。
两种思路虽然时间复杂度的量级是一致的,但相差一个常数的倍数,其实还是后一种方法更快些,也更加简洁,学到了。
AC代码
思路一:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
if (!x) return true;
stack<int> m_stack;
int num = x;
while (num != 0) {
m_stack.push(num % 10);
num /= 10;
}
while (x != 0) {
int cur = m_stack.top(); m_stack.pop();
if (x % 10 != cur) return false;
x /= 10;
}
return true;
}
};
思路二:
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0) return false;
if (!x) return true;
if (x % 10 == 0) return false;
int reversed_num = 0;
while (x > reversed_num) {
reversed_num *= 10;
reversed_num += x % 10;
x /= 10;
}
return reversed_num == x || x == reversed_num / 10;
}
};
如果有问题,欢迎大家指正!!!