如何找到数组中另一个元素最近的较大元素?

时间:2014-09-12 16:03:36

标签: ruby arrays

我正在为我想要的课程做一些准备。他们作为实践提出的一个问题如下:

编写一个函数nearest_larger(arr, i),它接受​​一个数组和一个 指数。该函数应返回另一个索引j:这应该 满足:

(a)arr[i] < arr[j],AND (b)j2i之间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)

当{{1}}应返回2时,此{{1}}返回。

当遇到平局时,我无法解决问题。我以为我设计了我的代码来执行此操作(我将##放在我认为已解决的位置。)因为如果距离严格小于此值,它应该将索引分配给k我不知道它为什么会返回右边。我希望这是有道理的。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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