Arrays 删除数组中的所有其他项,直到只剩下一项
我的问题是要求迭代一个项目数组并删除所有其他项目,直到到达数组的末尾,然后开始向后迭代并不断删除所有其他项目,如此反复,直到数组中只剩下一个项目 例如:1,2,3,4,5将变成1,3,5,然后变成3 我知道我不应该从原始数组中删除,所以我创建了另一个数组,它只保留其他所有项,同时减小其大小,但我无法让它工作,并以无限循环结束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
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
而iarr=*(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