1. 程式人生 > >演算法的實戰(四):LeetCode -- Palindrome Number

演算法的實戰(四):LeetCode -- Palindrome Number

一 題目描述

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121
輸出: true

示例 2:

輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。

示例 3:

輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。

進階:

你能不將整數轉為字串來解決這個問題嗎?

二 解題思路

1.這道題我們第一時間可以聯想到我們上一道題-反轉數,只要反轉數跟原來的數一樣就返回true即可

2.但其中有一些可以優化的點:a.只要為負數的,都應該直接返回false; b.只要小於10 的正整數,都應該直接返回true,這樣可以省掉很多計算和比較次數,但最壞的情況可能會導致比較次數增多(測試的用列如果都是大於10的整數,兩個前提都會多增加兩次的比較)

三 程式碼實戰

public static int reverse (int x) {
        int reverse = 0;
        while (x!=0){
            reverse = reverse * 10 + x % 10;
            x/=10;
        }
        if(reverse>Integer.MAX_VALUE||reverse<Integer.MIN_VALUE){
            return 0;
        }

        return reverse;
    }

    public static boolean isPalindrome (int x){
        if(x<0){
            return false;
        }
        if(x<10){
            return true;
        }
        if(x==reverse(x)){
            return true;
        }
        return false;
    }

四  擴充套件點

用反轉的方法再優化最好的時間複雜度為O(n)(除了兩個特例(負數和小於10)的時間複雜度為O(1))(因為你得遍歷整數的位數)

但還有一種更加有優化空間的是用string來代替num型別的方法(但本題建議是不將它轉換成字串來解決,故不用此方法)

解題思路還是我之前的二分法思想,遍歷該數的一半長度,每一次把相對稱的元素進行對比,只要不相同則直接返回false,時間複雜度為O(n/2),程式碼例項如下:

public boolean isPalindrome(int x) {
        String s = ""+x;
        for(int i = 0;i < s.length()/2;i++)
        {
            if(s.charAt(i) != s.charAt(s.length()-1-i))
            {
                return false;
            }
        }

        return true;
    }