删除数组中的所有其他项,直到只剩下一个

时间:2017-10-30 11:26:14

标签: arrays ruby

我的问题是要求迭代一个项目数组并删除所有其他项目,直到我到达数组的末尾,然后我应该开始向后迭代并继续删除所有其他项目等来回直到只有一个项目是留在阵列中。

例如:1,2,3,4,5将变为1,3,5然后变为3

据我所知,我不应该从原始数组中删除所以我创建了另一个数组,只是在保持其他项目的同时减小其大小,但我无法使其工作并最终导致无限循环。

arr=*(1..10)
s_arr=[]
until s_arr.length==1 
i=0
   while i<arr.length
   s_arr.push(arr[i])
   i+=2
end
   arr=s_arr.reverse
   s_arr=arr
end

谢谢。

5 个答案:

答案 0 :(得分:1)

每次迭代时,将数组替换为每个其他元素都被删除的版本

arr = *(1..10)

while arr.length > 1
  arr = arr.select.with_index { |_, i| i % 2 == 0 }.reverse
end

这与您的示例不符,但您的示例首先似乎不一致。如果[1,2,3,4,5]进入[1,3,5],那么下一步应该是[1,5]而不是[3]。

答案 1 :(得分:1)

这与@ Max的答案类似,但是以递归方式实现。

def last_one_standing(arr)
  return arr.first if arr.size == 1
  last_one_standing arr.select.with_index { |_,i| i.even? }.reverse
end

(1..16).each { |i| puts "1..%d: %d" % [i, last_one_standing((1..i).to_a)] }
1..1:   1
1..2:   1
1..3:   3
1..4:   3
1..5:   1
1..6:   1
1..7:   3
1..8:   3
1..9:   9
1..10:  9
1..11: 11
1..12: 11
1..13:  9
1..14:  9
1..15: 11
1..16: 11      

答案 2 :(得分:0)

arr=*(1..10)

s_arr=[]

until s_arr.length == 1
  i=0
  while i < arr.length
    s_arr.push(arr[i])
    i+=2
  end

  arr=s_arr.reverse

  if s_arr.length != 1
    s_arr=[]
  end

end

您的问题是将s_arr数组设置为与arr相同。然后你必须添加一个条件,告诉它在达到1时停止,否则它会变为0。

编辑:

arr=*(1..10)

s_arr=[]

until s_arr.length == 1
  s_arr = []
  i=0
  while i < arr.length
    s_arr.push(arr[i])
    i+=2
  end
  arr=s_arr.reverse
end

更好的解决方案。

答案 3 :(得分:0)

尝试这样的事情,这样你就可以利用Ruby的力量

result = []
array.each_with_index {|val,idx| result << val if ( idx % 2 == 0)}

答案 4 :(得分:0)

在ruby控制台上试试这个:

arr=*(1..10)

x = (Math::log(arr.length) / Math::log(3)).to_i

3**x