【每日一題】LeetCode. 9. 迴文數

每日一題,防止癡呆 = =

一、題目大意

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
在這裏插入圖片描述
來源:力扣(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;
    }
};

如果有問題,歡迎大家指正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章