在面试一个Java开发人员的职位时,我被要求设计一个算法,从一个包含100万个值的数组中找出十个最大的值。我想出了一个简单的蛮力算法,让面试官非常满意。我明天要参加第二轮面试。
因为我喜欢挑战自己,所以我一直在阅读"Clojure for the Brave and True",并在采访后不久读到关于Lazy Sequences and Collections的部分,并开始考虑是否可以实现一个Clojure函数来完成同样的任务。
我得到了实际的过滤功能正常工作,但无法理解我在运行应用程序时看到的内容。以下是我的代码:
(defn random-numbers
([] (random-numbers 0))
([n] (cons n (lazy-seq (random-numbers (rand 10000))))))
(def big-array (take 1000000 (random-numbers)))
(defn top-ten [[big0 big1 big2 big3 big4 big5 big6 big7 big8 big9 :as acc] x]
(cond
(> x big0) [x big1 big2 big3 big4 big5 big6 big7 big8 big9]
(> x big1) [big0 x big2 big3 big4 big5 big6 big7 big8 big9]
(> x big2) [big0 big1 x big3 big4 big5 big6 big7 big8 big9]
(> x big3) [big0 big1 big2 x big4 big5 big6 big7 big8 big9]
(> x big4) [big0 big1 big2 big3 x big5 big6 big7 big8 big9]
(> x big5) [big0 big1 big2 big3 big4 x big6 big7 big8 big9]
(> x big6) [big0 big1 big2 big3 big4 big5 x big7 big8 big9]
(> x big7) [big0 big1 big2 big3 big4 big5 big6 x big8 big9]
(> x big8) [big0 big1 big2 big3 big4 big5 big6 big7 x big9]
(> x big9) [big0 big1 big2 big3 big4 big5 big6 big7 big8 x]
:else acc))
(defn top-ten-list [coll]
(reduce top-ten [0 0 0 0 0 0 0 0 0 0] coll))
(defn unlines [coll]
(clojure.string/join newline coll))
(defn -main []
(print (unlines (top-ten-list big-array))))
(-main)
它产生两次预期输出:
9999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.447171545269999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.44717154526
根据我是使用print还是println,输出会有轻微的变化,因为如果我使用println,第二组输出将从新的一行开始。
我相当确定第一个输出是我调用函数和处理其结果的方式的工件,但我不确定我哪里出错了!
在加载命名空间时执行底部的-main
。然后在它上面调用-main
,再次运行它。所以,只要去掉最后的(-main)
,你就应该完成了。