为什么我的代码返回错误的索引号?

时间:2013-05-16 18:40:56

标签: ruby indexing

需要帮助解决这个家庭作业问题。我如何编写一个函数,nearest_larger(arr,i),它接受一个数组和一个索引。该函数应该返回另一个索引。条件如下。感谢。

This should satisfy:

(a) `arr[i] < arr[j]`, AND
(b) there is no `j2` closer to `i` than `j` where `arr[i] < arr[j]`.
  

如果是关系(请参见示例beow),请选择两个索引中最早的(最左侧)。如果arr中的数字不是arr[i],请返回nil

     

示例:

     

nearest_larger([2,3,4,8],2).should == 3      端

我的代码是:

def nearest_larger(arr, idx)

  greater_nums = []

  arr.each {|element| greater_nums << element if element>idx}

    sorted_greater_nums= greater_nums.sort

    nearest_larger = sorted_greater_nums[0]

    arr.index(nearest_larger)

end

感谢很多人。请参阅下面的帖子了解解决方案

1 个答案:

答案 0 :(得分:3)

我在这里至少看到两个错误。

首先,您的代码似乎假设数组已排序。 (否则为什么至少使用greater_nums给你最近的索引?)但是根据你的要求(如果出现平局选择最左边的索引),这显然无法保证。

更重要的是,在each循环中,您将elementidx(传入的索引)而不是arr[idx]进行比较。

我认为你真正想要的是这样的事情:

def nearest_larger(arr, idx)
  value = arr[idx]

  # Ensure idx is actually valid.
  return nil if idx < 0 || idx >= arr.length

  left, right = [idx - 1, idx + 1]
  while (left >= 0 || right < arr.length)
    # Always check left first, per the requirement.
    return left if left >= 0 && arr[left] > value
    return right if right < arr.length && arr[right] > value

    # Incrementally move farther and farther left/right from the specified index
    # looking for a larger value.
    left, right = [left - 1, right + 1]
  end

  # This will return nil if no values were larger than arr[idx].
end