【问题标题】:How to sort an array by amount of unique groups it can create如何按可以创建的唯一组的数量对数组进行排序
【发布时间】:2015-04-30 11:49:03
【问题描述】:

我不知道如何正确地提出问题,但我想要的是以下内容:

假设有一个数组

[1,1,1,1,2,2,2,3,3,3,4,4,5]

如何排序,直到变成输出:

[1,2,3,4,5,1,2,3,4,1,2,3,1]

为了使输出更具可读性:

[[1,2,3,4,5],[1,2,3,4],[1,2,3],[1]]

到目前为止,我想出的是:

array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
array.group_by{|n| n }.values.transpose.flatten

但是由于没有相同数量的数字,这会引发错误。

有人可以帮忙吗?

【问题讨论】:

  • 简洁明确地陈述你的问题并不难:“给定一个数组a和一个空数组b,我希望获得一个数组c,它包含a,将c添加到b,从a中删除c的每个元素之一,重复这些步骤直到a为空,然后返回b。”一旦明确说明,将问题的每个元素转换为代码就相当简单了。

标签: ruby


【解决方案1】:

这需要一段时间,但这是你想要的:

array = [1,1,1,1,2,2,2,3,3,3,4,4,5]

a = array.group_by{|n| n }.values.sort_by(&:length).reverse

a.each{|q| (a[0].size-q.size).times{q<<nil}}

a.sort.transpose.flatten.compact

它产生:

  => [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]

*你有 3 个二的数目

【讨论】:

  • 这有效,但前提是a[0] 是最大的组。
  • 立即查看编辑。具有最大长度的子数组将始终在第一个索引上
  • 是的,在这种特殊情况下。但是假设您的数组包含 5 个 2,例如:[1,1,1,1,2,2,2,2,2,3,3,3,4,4,5]。比 sort 不会按最大长度排序。但是感谢您的回答,我想出了自己的答案,确实考虑到了这一点。这只是微调的问题。
【解决方案2】:
▶ array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
▶ tap = array.group_by(&:to_i).values.sort do |i, j| 
▷   result = j.length <=> i.length
▷   result.zero? ? i <=> j : result
▷ end
▶ tap.map do |e| 
▷   e.fill nil, (e.length...tap.first.length)
▷ end.transpose.flatten.compact
#⇒ [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1]

【讨论】:

    【解决方案3】:

    我也想出了自己的答案。

    array = [1,1,1,1,2,2,2,3,3,3,4,4,5]
    
    # group all the values in single array
    a = array.group_by{|n| n }.values.sort{|a,b| b.size <=> a.size }
    
    # fill every other space in the other subarrays with nil
    a.each{|q| q.fill(nil, (a[0].size...q.size)) }
    
    # transpose, flatten and remove all the nil values
    a.transpose.flatten.compact
    

    如果有人知道“更小”更易读的答案,请告诉。

    【讨论】:

      【解决方案4】:

      arr 成为您的数组。那么:

      def transform(arr)
        a = arr.sort
        b = []
        until a.empty?
          u = a.uniq
          b << u
          a = a.difference(u)
        end
        b
      end
      

      助手Array#difference在我的回答here中定义。

      让我们试试吧:

      transform(arr)
        #=> [[1,2,3,4,5], [1,2,3,4], [1,2,3], [1]]
      

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多