2014-09-12 2 views
0

Я делаю небольшую подготовку к курсу, который я хочу взять. Один из вопросов, который они задают в качестве практики, следующий:Как найти ближайший более крупный элемент к другому элементу массива?

Напишите функцию, nearest_larger(arr, i), которая принимает массив и индекс . Функция должна возвращать другой индекс, j: это должно удовлетворять :

(а) arr[i] < arr[j] и (б) нет j2 ближе к i, чем j, где arr[i] < arr[j].

В случае галстуков (см. Пример ниже), выберите самый ранний (самый левый) из двух индексов. Если число в arr больше, чем arr[i], возвращение nil.

Так код, который я написал, было:

def function(arr,i) 
    k = arr.length 
    puts "nil" if arr.all? {|number| arr[i] >= number} 
     (0..(arr.length-1)).to_a.each do |j| 
      if arr[j] > arr[i] 
       k = j if((i-j).abs < k) ## 
      end 
     end 
    puts k 
end 

Этот function([1,2,6,5,10],3) возвращает 4, когда он должен быть вернуться 2.

У меня возникают проблемы адресации сценарий, когда есть связь. Я думал, что я разработал свой код для этого (я помещаю ##, где, на мой взгляд, это исправлено). Потому что ему нужно назначать индекс k, если расстояние строго меньше, поэтому я не знаю, почему он вернет право боковая сторона. Я надеюсь, что в этом есть смысл. Любая помощь приветствуется.

+0

Вы, вероятно, хотите, чтобы прочитать на [ 'index'] (http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-index), который, если giv в блоке, делает большинство из того, что вы хотите. – tadman

ответ

0

Из текущего кода:

def function(arr,i) 
    k = i - arr.length # the first result of (i-k).abs should be array length. 
    # returns -1 for testability purposes for `puts` 
    # this should be changed to return `nil` 
    return -1 if arr.all? {|number| arr[i] >= number} 
    (0...arr.length).to_a.each do |j| 
     if arr[j] > arr[i] 
      # since k is an index you should compare distance between i and j 
      # against the distance between i and k 
      k = j if((i-j).abs < (i-k).abs) 
     end 
    end 
    k 
end 

puts function([1,2,6,5,10], 0) 
puts function([1,2,6,5,10], 1) 
puts function([1,2,6,5,10], 2) 
puts function([1,2,6,5,10], 3) 
puts function([1,2,6,5,10], 4) 

Выход:

1 
2 
4 
2 
-1 
+0

он думает 'функция ([1,2,6,5,10], 3)' fail здесь тоже – kriskova

+0

@kriskova он возвращает '2'. Это не подводит. –

+0

он должен вернуться 4, нет? Хорошее упражнение btw: D – kriskova

0
k = arr.length 

Вы дефолт k к длине массива, но это ваше возвращаемое значение. Лучше всего сделать что-то вроде nil, так что это не путает вопросы. Я думаю, что это то, откуда приходит ваше возвращаемое значение 4. Если вы добавите новое значение в массив, это будет печать 5, новая длина массива.

puts "nil" if arr.all? {|number| arr[i] >= number} 

Когда вы делаете «есть любое значение больше, чем мое значение индекса» тест с all?, вы не возвращаются, так что метод будет продолжать, а также напечатать длину массива (см. Выше)

(0..(arr.length-1)).to_a.each do |j| 

Enumerable (следовательно Array) имеет each_with_index метод, поэтому вам не нужно указывать/вычислить индекс находится вне передней петли. Вам не нужно конвертировать диапазон (0..x)to_a, чтобы обойти его.

k = j if((i-j).abs < k) ## 

Вы сравниваете расстояние j от k, а не от расстояния k.

Вы можете использовать оба теста в одном цикле массива. С тестом < самый левый ответ в галстуке берет на себя по приказу, который вы проходите по массиву.

def find_closest_larger_index values, test_index, found = nil 

    values.each_with_index do |value,j| 
    found = j if value > values[test_index] and (found.nil? or (test_index - j).abs < (test_index - found).abs ) 
    end 

    found 
end 

Дает

> find_closest_larger_index [1,2,6,5,10], 0 
=> 1 
> find_closest_larger_index [1,2,6,5,10], 1 
=> 2 
> find_closest_larger_index [1,2,6,5,10], 2 
=> 4 
> find_closest_larger_index [1,2,6,5,10], 3 
=> 2 
> find_closest_larger_index [1,2,6,5,10], 4 
=> nil 
+0

Я прочитал его как найти ближайшую большую ценность ..., которая была бы 2 при индексе 1 ?? – Matt

+1

и 'find_closest_larger [1,2,6,5,10], 1 должен возвращать' 2', а не '3' – kriskova

+0

, он должен вернуть индекс ближайших продавцов – kriskova

Смежные вопросы