Алгоритм для массива с циклом `while` или` before` - PullRequest
0 голосов
/ 21 января 2019

у меня есть:

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 голосов
/ 21 января 2019

Я бы предложил эту опцию, просто чтобы избежать бесконечных циклов или диапазона индексации:

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]

0 голосов
/ 21 января 2019
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]
0 голосов
/ 21 января 2019

Как говорят другие, вам нужно изменить индекс в вашем цикле.Кроме того, если вы хотите -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]
0 голосов
/ 21 января 2019

Как уже говорилось в комментариях, вы перебираете массив, который вам не нужен.

Вы можете использовать рекурсивный метод для обработки перехода от одного элемента к другому на основе предыдущего значения. Учтите следующее:

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)
0 голосов
/ 21 января 2019
until a[i] == -1
  array << a[result]
end

Этот код постоянно зацикливается - нечего менять i.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...