每日一題,防止癡呆 = =
一、題目大意
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
來源:力扣(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;
}
};
如果有問題,歡迎大家指正!!!