2012-02-05 59 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字符串

相关问题