LeetCode演算法9:java 迴文數
阿新 • • 發佈:2018-12-23
1、題目
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。
2、思路:
這個問題比較講究數學思維,並且對於特殊情況需要考慮周到。
思路如下:
1、第一反應就是將整數轉換為字串,然後檢查字串是否是迴文。但建立字串需要O(n)的(非常量)空間,這與題目的要求是不符合的。
2、第二個想法是,將整數本身逆序,然後將逆序後的整數和原來的整數進行比較。如果它們相同,那麼一定是迴文數。但是,需要注意的是,逆序後的數字可能>int.Max。這會導致溢位。
3、為了避免產生溢位問題,我們可以只逆序整數的一半。迴文數的後半部分的逆序應該和迴文數的前半部分相同。
舉個例子,如果輸入的是“1221”,我們可以將“1221”的後半部分從“21”逆序為“12”,並與“1221”的前半部分進行比較。
如果相同,那麼就是一個迴文數。
對於整數“1221”,通過“1221%10”,我們就可以得到最後一位“1”。可以把“1221/10 =122”,再“122%10”,我們就可以得到倒數第二位了。
重複這樣的過程,直到這個整數的中間位置。但是對於“12321“的情況也要最終考慮周全。
4、現在問題的關鍵是,我們如何知道,我們已經到了這個整數的中間位置了。
當逆序後的數的值大於原來的值的時候,就到了這個整數的中間位置了!
3、程式碼
package _01_50; public class _09PalindromeNumber{ public boolean isPalindrome(int num){ //special scene if(num<0||((num%10==0)&&num!=0)) return false; int revert = 0; while(true){ revert = revert*10 + num%10; num = num/10; if(revert>=num) break; } if(revert == num){ return true; }else if(revert/10 == num){ return true; }return false; } public static void main(String[] arg){ _09PalindromeNumber PalindromeNumber = new _09PalindromeNumber(); int a = 121; int b = 1221; int c = 1234321; int d = 123321; int e = 1; int f = 12; System.out.println(PalindromeNumber.isPalindrome(a)); System.out.println(PalindromeNumber.isPalindrome(b)); System.out.println(PalindromeNumber.isPalindrome(c)); System.out.println(PalindromeNumber.isPalindrome(d)); System.out.println(PalindromeNumber.isPalindrome(e)); System.out.println(PalindromeNumber.isPalindrome(f)); } }
參考:
LeetCode 9. 迴文數