【发布时间】:2011-06-30 11:17:28
【问题描述】:
假设我有一个数组,其中包含三个以上给定数字的重复。 我只想删除其中三个重复项,并将该数字的任何剩余实例留在结果数组中。
例如:
a = [2, 2, 2, 1, 6]
b = a.map{|i|
num = a.select{|v| v == i}.size
num == 3 ? "" : i
}.reject{|v|
v == ""
}
给了我想要的结果:
b == [1, 6]
但是,在下面的示例中,我希望最后一个“2”保留在数组中。
# I want to reject ONLY triplets.
# In the below example, the last "2" should remain
a = [2, 2, 2, 1, 2]
b = a.map{|i|
num = a.select{|v| v == i}.size
num == 3 ? "" : i
}.reject{|v|
v == ""
}
这里的结果是:
b == [2, 2, 2, 1, 2]
我希望结果是:
b == [1, 2]
我还有另一个代码块,类似于上面的代码块,使用了一些不同的逻辑,但最终得到了相同的结果:
a = [2, 2, 2, 1, 2]
newdice = a.reject { |v|
if a.count(v) == 3
x = v
end
v == x
}
我不知所措,除了一些令人讨厌的诡计,包括查找 3x 重复数字的第一个实例的索引,并从中切出 [index, 2] 。必须有一种更“类似红宝石”的方式。
谢谢!
【问题讨论】:
-
要删除前三个出现的 2,而不是第一次出现的连续三个 2?
-
哪个位置会成为删除的目标?总是相同数字的前三个实例?元素总是一个数字吗?
-
@steenslag:2 的前三个出现。对于
[2, 2, 2, 2, 2],我希望它返回[2, 2]。也可以是[2, 1, 2, 3, 2]。 -
@sawa:是的,元素总是一个数字。职位无所谓。总是相同数字的前三个实例。
-
请参阅下面的最后一条评论,了解我公认的笨重但有效的单线解决方案。感谢您的所有帮助!
标签: ruby select sequence digits