我有:
array = [1, 4, -1, 3, 2]
我想要一个遵循以下逻辑的新数组:
新数组应为:
[1, 4, 2, -1]
我有:
def task(a)
array = []
a.each_with_index do |v, i|
result = a[i]
until a[i] == -1
array << a[result]
end
end
puts result
end
答案 0 :(得分:3)
正如其他人所说,您需要在循环中更改索引。另外,如果要在结果中使用-1
,则应从底部退出。 with_index
会给您顺序索引,这不是您想要的。这将满足您的要求:
def task(a)
i = 0
array = []
begin
i = a[i]
array << i
end until i == -1
array
end
p task([1, 4, -1, 3, 2])
# => [1, 4, 2, -1]
答案 1 :(得分:2)
until a[i] == -1
array << a[result]
end
此代码永恒循环-无需更改i
。
答案 2 :(得分:1)
如评论中所述,您正在遍历数组,而这并不是您所需要的。
您可以使用递归方法根据先前的值处理从一个元素到另一个元素的跳转。请考虑以下内容:
arr = [1, 4, -1, 3, 2]
def task(arr, n=0, result=[])
if arr[n] == -1
return result + [-1]
end
r = arr[n]
task(arr, r, result + [r])
end
puts task(arr)
答案 3 :(得分:0)
input_array = [1, 4, -1, 3, 2]
last_valid_index = input_array.find_index { |entry| entry < 0 }
first_element = input_array.first
last_element = input_array[last_valid_index]
middle_elements = (1..last_valid_index).map { |i| input_array[input_array[i-1]]}
output_array = [first_element] + middle_elements + [last_element]
p output_array
# => [1, 4, 2, -1]
您可以像这样在一行上完成大多数操作,但是我认为更详细的版本更易于记录。
input_array = [1, 4, -1, 3, 2]
last_valid_index = input_array.find_index { |entry| entry < 0 }
output_array = [input_array.first] + (1..last_valid_index).map { |i| input_array[input_array[i-1]]} + [input_array[last_valid_index]]
p output_array
# => [1, 4, 2, -1]
答案 4 :(得分:0)
我建议使用此选项,只是为了避免无限循环或超出范围索引:
i, ary = 0, [array[0]]
array.size.times do
break if array[i] == -1 or array[i] > array.size - 1
i = array[i]
ary << array[i]
end
ary #=> [1, 4, 2, -1]
例如array = [1, 4, -1, 0, 3]
时发生无限循环。
当array = [1, 4, 6, 3, 2]