2012-02-05 80 views

回答

6
(defn palindrome? [num] 
    (= (seq (str num)) (clojure.string/reverse (str num)))) 
+1

反向爲SEQ線性時間。最好使用clojure.string/reverse來反轉字符串。如果你已經有一個向量,rseq是一個向量的常量時間。 – miner49r 2012-02-21 19:54:52

9

試試這個:

(defn is-palindrome? [num] 
    (= (str num) (apply str (reverse (str num))))) 

在您的代碼中,表達式(reverse (str 1221))返回字符的列表(\1 \2 \2 \1),需要將其重新轉換爲字符串以供比較工作。或者,你可以兩個數字轉換爲字符列表並進行列表比較,而不是:因爲它比較的序列,它可以永遠不等於字符串

(defn is-palindrome? [num] 
    (= (seq (str num)) (reverse (str num)))) 
3

您的代碼返回false。

你可以把它用字符串明確地轉換成序列的工作方式如下:

(defn is-palindrome? [num] 
    (let [digit-sequence (seq (str num))] 
    (= digit-sequence (reverse digit-sequence)))) 
1

原來的操作字符集的開銷占主導地位,所以它實際上是更快的比較原始字符串轉換爲反轉版本,即使它看起來像是比較需要的字符數量的兩倍。確保你使用clojure.string/reverse,而不是clojure.core/reverse。通常的Clojure慣例是用一個問號結束一個謂詞,但不要使用「is」前綴。

(require 'clojure.string) 

(defn palindrome? [s] (= s (clojure.string/reverse s))) 
(defn palindrome-num? [n] (palindrome? (str n))) 
0
(reverse (str 1221)) 

返回字符

(\1 \2 \2 \1) 

的清單,但(STR 1221)是Java字符串

相關問題