在Clojure程序中,我有一系列数字:
(2 3 4 6 8 1)
Run Code Online (Sandbox Code Playgroud)
我想找到项目顺序的最长子序列:
(2 3 4)
Run Code Online (Sandbox Code Playgroud)
我假设它将涉及(take-while ...)或(reduce ...).
有任何想法吗?
澄清:我需要最长的连续项目列表.我更确定,更容易.感谢我解决我最初提出的更难的问题.
cgr*_*and 12
如果您只对最长的初始序列感兴趣,那么它是1-liner:
(defn longest-initial-sequence [[x :as s]]
(take-while identity (map #(#{%1} %2) s (iterate inc x))))
Run Code Online (Sandbox Code Playgroud)
考虑到OP对这个问题的评论 - 这完全改变了游戏! - 这可以写得非常简单:
(let [doubletons (partition 2 1 [1 2 3 5 6])
increment? (fn increment? [[x y]]
(== (inc x) y))]
(cons (ffirst doubletons)
(map second (take-while increment? doubletons))))
;; returns (1 2 3)
Run Code Online (Sandbox Code Playgroud)
请注意,这实际上是懒惰的.我希望它不会doubletons让当地人清除感谢.另一个版本:
(cons (first [1 2 3 5 6])
(map second (take-while increment? (partition 2 1 [1 2 3 5 6]))))
Run Code Online (Sandbox Code Playgroud)
不过,问题的原始版本更有趣!:-)可以使用上面的方法构建一个超级简单的解决方案,但是当然这将比使用的性能低得多reduce.我会看看我是否与zmila和dnolen的解决方案有很大的不同 - 但仍然合理地表现 - 稍后会添加到该线程的那一部分.(我猜不太可能.)
| 归档时间: |
|
| 查看次数: |
1238 次 |
| 最近记录: |