查找数组中重复元素的长度

Pet*_*xey 0 ruby algorithm

我想在下面的数组中找到条纹的长度:

states = [:read, :read, :read, :unread, :unread, :read, :read, :read, :read]
Run Code Online (Sandbox Code Playgroud)

数组有:read或者:unread,我希望每个条纹的长度为:read/ :unread.因为states,这将成为:

streak_lengths = [3, 3, 3, 2, 2, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

该阵列有三个打开:read的元素,而我们每个标签的那些作为一个的一部分3连胜,但随后有两个:unread要素,所以他们各自用一个2连胜,最后我们有四个读消息的连胜,所以他们每个都标有一个4.

什么是解决上述问题的优雅,高效和可读的方法?

这是一个递归问题吗?虽然我可以解决这个问题,但我觉得它暗示了一种我不熟悉的解决方法.它暗示也许这是通过递归最好地解决的问题.

(有关的利益"可能重复"应用于此标志:两个线程实际上有略微不同的讨论,除了从搜索的角度来看,你只会发现另一个线程,如果你搜索重复字符,这个答案你如何检测重复的数组元素.最后这里有很多优秀的答案,删除这个问题不会让生态系统更富裕,只会更穷)

saw*_*awa 7

chunk将数据块分段为一个连续的元素,这些元素在调用它们时具有相同的返回值.flat_map将块返回的数组连接成一个数组.

states.chunk(&:itself).flat_map{|_, a| Array.new(a.length, a.length)}
# => [3, 3, 3, 2, 2, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

如果你愿意的话,也许你可以以递归的方式做到,但我认为这不会导致优雅的解决方案.根据我的经验,最好尽可能避免递归.

  • 请解释一下 (6认同)
  • @PeterNixey`本身`是在Ruby 2.2中引入的.你可以写`chunk {| e | 相反. (3认同)
  • @sawa很好的解决方案.添加一个解释,我会upvote. (2认同)

Car*_*and 5

使用Ruby v2.2

states.slice_when { |a,b| a != b }.flat_map { |a| [a.size]*a.size }
  #=> [3, 3, 3, 2, 2, 4, 4, 4, 4]
Run Code Online (Sandbox Code Playgroud)

使用Ruby v2.3

states.chunk_while { |a,b| a == b }.flat_map { |a| [a.size]*a.size }
  #=> [3, 3, 3, 2, 2, 4, 4, 4, 4] 
Run Code Online (Sandbox Code Playgroud)

但这些都不比普通的老年人有任何优势chunk.

  • @sawa,记得"伤心",在看到你的评论之前我添加了`chunk_while`. (2认同)