1. 程式人生 > >【演算法】LeetCode演算法題-Palindrome Number

【演算法】LeetCode演算法題-Palindrome Number

這是悅樂書的第144次更新,第146篇原創

今天這道題和迴文有關,即從前往後和從後往前是一樣的,如“上海自來水來自海上”就是一個迴文字串,如整數121就是迴文數,這些都是和迴文相關的。

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第3題(順位題號是9),給定一個整數,判斷其是否為迴文整數,即向前讀和向後讀的整數一樣。

輸入: 121 輸出: true

輸入: -121 輸出: false 說明:從左到右讀為-121。從右到左讀為121-。因此它不是迴文。

輸入: 10 輸出: false 說明:從左到右讀為10。從右到左讀為01。因此它不是迴文。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 分析題目

如果你看過昨天的演算法題——反轉整數,會不會覺得兩個題目有相似之處?

沒看過也不要緊,咱們再重新分析此題的解法。

拿到從右往左讀的整數,即最後一位數變第一位,倒數第二位變第二位,利用對10取餘可以實現。例如: 1223 取反為 3221

最後一位數 = 1223%10 = 3 倒數第二位數 = 122%10 = 2, 其中122是1223除以10後的數 倒數第三位數 = 12%10 = 2, 其中12是122除以10後的數 倒數第四位數 = 1%10 = 1, 其中1是12除以10後的數

拿到反轉的數:3x1000 + 2x100 + 2x10 + 1 = 3221

可以進一步分析反轉的數是怎麼來的:

0*10 + 3 = 3

3*10 + 2 = 32

32*10 + 2 = 322

322*10 + 1 = 3221

反轉的數是原數對10取餘的餘數從個十百位依次向前移動 加上 新的餘數。

拿到反轉的數後,比較原數和新數是否一致就行,但是還有另外一個問題,就是溢位風險。

這時需要考慮是否需要全部反轉完原數才去比較?是不需要的。

原數是迴圈除以10取整,只要取整後的數大於反轉的數,繼續迴圈,反之結束迴圈。

1223迴圈2次取整後得到12,新反轉數為32,這時12>32為false,並且兩數不相等,已經可以直接判斷了。

public static boolean isPalindrome(int x) {
    boolean flag = false;
    // 如果x=0,符合迴文數
    if (x == 0) {
        return true;
    }
    // 輸入負數和個位數為0肯定不是迴文數,可以直接判斷
    if (x < 0 || x%10 == 0) {
        return false;
    }
    int tem = 0;
    while (x > tem) {
        tem = tem*10 + x%10;
        x /= 10;
    }
    if (x == tem || x == tem/10) {
        flag = true;
    }
    return flag;
}

03 小結

因為今天的這道題和昨天的那道很相似,可以兩篇合著一起看。其實這道判斷是否為迴文整數的題,也可以取巧使用字串反轉操作,雖然時間上省了很多,不過佔用的空間更大罷了。

如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!

本文首發於我的個人公眾號:悅樂書,轉載請註明出處!