在Ruby中,我希望pop
一个元素(最小的)离开一个数组,并push
相同的元素到一个新数组。我需要它是获得push
的相同元素,因为我想以递归方式执行它而不会发生这种情况:
a = [1,4,2,3,5,7,8,6]
b = []
b.push(a.min) #=> b = [1]
b.push(a.min) #=> b = [1,1]
b.push(a.min) #=> b = [1,1,1]
而不是
b.push(a.min) #=> b = [1]
b.push(a.min) #=> b = [1,2]
b.push(a.min) #=> b = [1,2,3]
编辑:
应该提到,我试图不使用sort
,谢谢!
答案 0 :(得分:3)
问题请求递归方法。其他答案都不是递归的。
这是一个递归解决方案:
class Array
def recursive_pop
any? ? [delete(min)] + recursive_pop : []
end
end
irb(main):082:0> original_array = [1,2,3]
=> [1, 2, 3]
irb(main):083:0> new_array = original_array.recursive_pop
=> [1, 2, 3]
irb(main):084:0> new_array
=> [1, 2, 3]
irb(main):085:0> original_array
=> []
根据要求,该方法逐个删除原始数组中的最小元素,并将该元素添加到新数组中。
答案 1 :(得分:1)
如果我理解正确,您可以sort
初始数组,然后使用shift
方法提取第一个元素。
a = [1,4,2,3,5,7,8,6].sort
b = []
b.push(a.shift) #=> b = [1]
b.push(a.shift) #=> b = [1,2]
b.push(a.shift) #=> b = [1,2,3]
答案 2 :(得分:1)
如果它是严格的数字,你正在寻找(或按字母顺序排列),你总是可以使用array.sort。
a = a.sort
成为
a = [1,2,3,4,5,6,7,8]
。
然后
b.push(a.shift)
答案 3 :(得分:1)
使用v.2.2 +,您可以将Enumerable#min与参数一起使用:
def pop_n_push(arr, n)
arr.min(n).each { |e| arr.delete_at(arr.index(e)) }.to_a
end
arr = [7,8,1,4,2,3,5,2,6]
new_arr = pop_n_push(arr, 4)
#=> [1, 2, 2, 3]
arr
#=> [7, 8, 4, 5, 6]
min
返回包含n
arr
最小元素的枚举数。这些元素中的每一个都位于arr
中并从中删除。 (重复值不是问题。)Enumerator#each返回其接收器,即枚举器,然后将其转换为数组并由方法返回。可以写一下:
arr.min(n).to_a.each { |e| arr.delete_at(arr.index(e)) }
请注意,此方法会保留arr
中元素的顺序。当n
远远小于arr.size
时,它也应该比排序数组更快。