ACM之判斷迴文數

lightwing發表於2021-09-09

題目如下


這道題比較簡單,先上Python程式碼感受一下,就一行搞定:

#判斷迴文數def isPalindrom(x):    return  str(x) == str(x)[::-1]

這種方法雖然簡單,但是耗時比較長。再用Java解決一下看看

方法一

顯然負數不可能是迴文數,區間[0,9]的整數肯定是迴文數,所以把這些確定的條件先進行判斷

將整數的每一位放在連結串列中,然後將連結串列逆序,比較逆序連結串列與順序連結串列元素是否一樣,一樣則是迴文數,否則不是

程式碼如下:

public class PalindromNumber {    public boolean isPalindrom(int x){        if(x < 0) return false;        List<Integer> num = new ArrayList();        while(x != 0){            num.add(x % 10);            x = x / 10;        }        int len = num.size();        List<Integer> numRev = new ArrayList();        for(int i = len-1;i >= 0;i--){            numRev.add(num.get(i));        }        for(int i = 0;i < len ;i++) {            if(num.get(i) != numRev.get(i)){                return false;            }                        }             return true;    }

方法二

    將上述程式碼最佳化,發現其實我們只需要比較一般就行了,也就是將數從左往右讀的前一半與從右往左讀的後一半比較就ok,比如一個數12133121,前一半為1213,後一半是1213,顯然數迴文數。當一個數不能平均分為兩半時,將較大的數(即前一半)整除10得到的數再與小數比較就行,因為前一半各位的數字也可以作為後一半的最高位,是公用的,去掉不會有影響。如121343121,前一半為121234,後一半為1213,12134/10=1213與後一半相同,故判斷為迴文數

程式碼:

public class PalindromNumberBter {    public boolean isPalindrom(int x){        if(x < 0 || (x > 0 && x % 10 == 0)) return false;        int half = 0;        while(x > half) {            half = half*10 + x%10;            x = x/10;        }        return (x == half  || x == half/10);    }

可以直觀的對比他們所需的時間,用時最少的是方法二







來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3407/viewspace-2815711/,如需轉載,請註明出處,否則將追究法律責任。

相關文章