【问题标题】:How to find numbers that occur more than once in a list using clojure如何使用clojure查找列表中多次出现的数字
【发布时间】:2017-01-16 18:06:35
【问题描述】:

我有一个数字列表 2 4 3 7 4 9 8 5 12 24 8。

我需要找到在 clojure 中重复多次的数字。

我已经使用frequencies 函数来查找。但结果是

{2 1,4 2,3 1,7 1,9 1,8 2,5 1,12 1,24 1}

我最初考虑将它们视为key value,然后将每个键值取一次,看看 val 是否 > 1。如果值大于 1,那么我需要增加 1。

但我无法解决这个问题。

谁能帮帮我?

无论如何我可以把它变成[[2 1][4 2][3 1][7 1][9 1][8 2][5 1][12 1][24 1]] 并递归地考虑每个向量或任何你能想到的更好的想法。

谢谢。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    下面的函数只会在你卡住的地方继续:

    (defn find-duplicates [numbers]
      (->> numbers
           (frequencies)
           (filter (fn [[k v]] (> v 1)))
           (keys)))
    

    它将过滤值大于 1 的映射条目,然后提取它们的键。

    (find-duplicates [2 4 3 7 4 9 8 5 12 24 8])
    ;; => (4 8)
    

    【讨论】:

      【解决方案2】:

      如果你想要重复的项目:

      (defn repeated [coll]
        (->> coll
             frequencies
             (remove #(= 1 (val %)))
             keys))
      
      (repeated [2 4 3 7 4 9 8 5 12 24 8])
      ;(4 8)
      

      如果你只想数一数:

      (defn repeat-count [coll]
        (->> coll
             frequencies
             (remove #(= 1 (val %)))
             count))
      
      (repeat-count [2 4 3 7 4 9 8 5 12 24 8])
      ;2
      

      你可以懒惰地做,这样它就可以在无穷无尽的序列上工作:

      (defn repeated [coll]
        ((fn ff [seen xs]
           (lazy-seq
            (when-let [[y & ys] (seq xs)]
              (case (seen y)
               ::several (ff seen ys)
               ::once (cons y (ff (assoc seen y ::several) ys))
               (ff (assoc seen y ::once) ys)))))
         {} coll))
      
      (repeated [2 4 3 7 4 9 8 5 12 24 8])
      ;(4 8)
      

      这类似于核心distinct


      ...最后,为简洁起见,...

      (defn repeated [coll]
        (for [[k v] (frequencies coll) :when (not= v 1)] k))
      

      我从Piotrek Byzdyl's answer 窃取了keys 的使用。它只应该应用于地图。但在一系列地图条目上效果很好。

      【讨论】:

        【解决方案3】:

        (->> s (group-by identity) (filter (comp next val)) keys)

        【讨论】:

          【解决方案4】:

          你在正确的轨道上。

          如果你对 hash-map 进行排序,例如。 G。通过map,你得到你描述的kv元组结构,并且可以在元素转换函数中解构单个元组:

          (->> s
               (frequencies)
               (map (fn [[number times]]
                      (cond-> number           ; take number
                        (> times 1) (inc)))))  ; inc if (times > 1), otherwise return number
          

          【讨论】:

            【解决方案5】:

            您可以使用这种方法。

            (def c [2 4 3 7 4 9 8 5 12 24 8])
            
            (->> c
                 sort
                 (partition-by identity)
                 (filter #(> (count %) 1))
                 (map first))
            

            【讨论】:

            • 这很好但计算成本更高,要实现与其他解决方案相同的计算复杂度,您可以选择 group-by 而不选择 sort(即 O(nlogn)
            猜你喜欢
            • 2021-06-11
            • 2020-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-28
            • 2020-12-03
            • 1970-01-01
            相关资源
            最近更新 更多