ACM之判斷回文數
阿新 • • 發佈:2018-07-12
不可 sim roc .get alt n-1 process ron cto 題目如下
這道題比較簡單,先上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); }
可以直觀的對比他們所需的時間,用時最少的是方法二
ACM之判斷回文數