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

Arrays 删除数组中的所有其他项,直到只剩下一项,arrays,ruby,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.pus

我的问题是要求迭代一个项目数组并删除所有其他项目,直到到达数组的末尾,然后开始向后迭代并不断删除所有其他项目,如此反复,直到数组中只剩下一个项目

例如: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
arr=*(1..10)
s_arr=[]
直到s_arr.length==1
i=0
而i
arr=*(1..10)
s_arr=[]
直到s_arr.length==1
i=0
而我
您的问题是将s_arr数组设置为与arr相同。然后您必须添加一个条件,当它达到1时告诉它停止,否则它将变为0

编辑:

arr=*(1..10)
s_arr=[]
直到s_arr.length==1
s_arr=[]
i=0
而我
更好的解决方案。

arr=*(1..10)
s_arr=[]
直到s_arr.length==1
i=0
而我
您的问题是将s_arr数组设置为与arr相同。然后您必须添加一个条件,当它达到1时告诉它停止,否则它将变为0

编辑:

arr=*(1..10)
s_arr=[]
直到s_arr.length==1
s_arr=[]
i=0
而我

更好的解决方案。

尝试类似的方法,这样您就可以利用Ruby的强大功能

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

array.each_与_index{val,idx | result尝试类似的方法,以便可以利用Ruby的强大功能

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

array.each_与_index{val,idx | result在ruby控制台上尝试以下操作:

arr=*(1..10)

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

3**x

在ruby控制台上尝试以下操作:

arr=*(1..10)

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

3**x

在每次迭代中,用一个版本替换数组,该版本中每删除一个元素

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]。

每次迭代,都用删除其他元素的版本替换数组

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]。

这类似于@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      

这类似于@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      


arr=*(1..10)
的输出是什么?不是
(0…arr.size)。每一个{索引{index,-index]。每一个{el{124; arr.delete_at el}
工作吗
[1,2,3,4,5,6,7,8]
的输出是什么?你好,塞巴斯蒂安,这一行arr=*(1..10)可以被任何数组替换,比如说arr=[2,21,1215,17,9]在这个数组上运行代码后,我只剩下两个元素=>[6,9],我需要以一个元素结束。有什么想法吗?还有代码中的-index是如何工作的?我以前从未使用过减号。谢谢。为什么要留下两个元素?您的说明是“以此类推,直到数组中只剩下一项”你好,Jörg W Mittag-我不确定我是否在跟踪你。我只是说,在运行Sebastian(不是我)建议的代码之后,给我留下了两个元素,而不是一个(就像我需要的那样)
arr=*(1..10)
?的输出不是
(0…arr.size)。每个{index{index}[index,-index]。每个{| el | arr.delete_at el}
工作?对
[1,2,3,4,5,6,7,8]
的输出是什么?Hello Sebastian这行arr=*(1..10)可以被任何数组替换让我们说arr=[2,21,1,5,6,12100,9,17]在这个数组上运行代码后,我剩下两个元素=>[6,9]最后我只需要一个。你有什么想法吗?还有-索引在你的代码中是如何工作的?我以前从来没有用过减号。谢谢。为什么你只剩下两个元素?你的说明是“如此反复,直到数组中只剩下一个项目”你好,Jörg W Mittag-我不确定我是否在关注你。我只是说,在运行Sebastian(不是我)建议的代码后,我只剩下2个元素,而不是一个(就像我需要的那样)非常感谢。非常好的解决方案。因此,通过添加条件/if s_arr.length!=1/我们确保一旦达到1的长度,它就会打破循环?是的。你也可以将s_arr移动到i=0的位置。我不了解这个站点上的一半人,这个人要求帮助他的代码,而不是帮助他创建其他c完全正确。非常感谢。非常好的解决方案。因此,通过添加条件/if s_arr.length!=1/我们确保一旦达到1的长度,它就会打破循环?是的。你也可以将s_arr移动到i=0的位置。我不了解这个站点上的一半人,这个人要求帮助他的代码,而不是帮助他创建一些代码我很欣赏你尝试导出一个封闭形式的解,但这是不正确的。例如,如果
arr=[1,2,3,4,5];x=(Math::log(arr.length)/Math::log(3))。to_I#1;3**x#=>3
。在第一个(左-右)之后,我们有
[1,3,5]
通过,然后是第二次(从右到左)通过后的
[1,5]
,最后是
[1]
。这需要一些数学上的理由,如果它真的有效的话。我很欣赏你尝试导出封闭形式的解,但这是不正确的。例如,如果
arr=[1,2,3,4,5];x=(Math::log(arr.length