2

在这个家庭作业问题上需要帮助。如何编写一个函数,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]`.

如果出现平局(参见下面的示例),请选择两个索引中最早的(最左侧)。如果 inarr中没有大于 的数字,则arr[i]返回nil

例子:

最近的_larger([2,3,4,8], 2).should == 3 end

我的代码是:

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

非常感谢你们。解决方法见下方帖子

4

1 回答 1

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
于 2013-05-16T19:13:39.470 回答