具有`while`或`until`循环的数组算法

时间:2019-01-20 23:14:26

标签: ruby algorithm

我有:

array = [1, 4, -1, 3, 2]

我想要一个遵循以下逻辑的新数组:

  • 第一个元素位于索引0处,因此为1。
  • 第二个元素位于索引1(因为索引0的值为1)。
  • 第三元素位于索引4处,因此它是2。
  • 依次类推,直到循环遇到最后一个值-1为止,并且应该制动。

新数组应为:

[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

5 个答案:

答案 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]

时,索引可能会超出范围