需要帮助解决这个家庭作业问题。我如何编写一个函数,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
感谢很多人。请参阅下面的帖子了解解决方案
答案 0 :(得分:3)
我在这里至少看到两个错误。
首先,您的代码似乎假设数组已排序。 (否则为什么至少使用greater_nums
给你最近的索引?)但是根据你的要求(如果出现平局选择最左边的索引),这显然无法保证。
更重要的是,在each
循环中,您将element
与idx
(传入的索引)而不是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