【演算法】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 小結
因為今天的這道題和昨天的那道很相似,可以兩篇合著一起看。其實這道判斷是否為迴文整數的題,也可以取巧使用字串反轉操作,雖然時間上省了很多,不過佔用的空間更大罷了。
如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!
本文首發於我的個人公眾號:悅樂書,轉載請註明出處!