1. 程式人生 > >LeetCode演算法9:java 迴文數

LeetCode演算法9:java 迴文數

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. 迴文數