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

Ruby 为什么我的代码返回了错误的索引号?,ruby,indexing,Ruby,Indexing,这个家庭作业问题需要帮助。如何编写一个取数组和索引的函数,最近的(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]`. 谢谢大家。有关解决方案,请参阅下面的帖子我在这里看到至少两个错误 首先,代码似乎假定数组已排序。(否则,为什么从最大值中取最小值会

这个家庭作业问题需要帮助。如何编写一个取数组和索引的函数,最近的(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]`.

谢谢大家。有关解决方案,请参阅下面的帖子

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

首先,代码似乎假定数组已排序。(否则,为什么从
最大值中取最小值会得到最接近的索引?)但从您的要求(如果是平局,请选择最左边的索引)来看,这显然不能保证

更重要的是,在
的每个
循环中,您将
元素
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
def最近的_较大值(arr、idx)
值=arr[idx]
#确保idx实际有效。
如果idx<0 | | idx>=arr.length,则返回nil
左,右=[idx-1,idx+1]
而(左>=0 | |右=0&&arr[left]>值,则返回left
如果right值,则返回right
#从指定索引开始逐渐向左/向右移动
#寻找更大的价值。
左,右=[左-1,右+1]
结束
#如果没有任何值大于arr[idx],则返回nil。
结束

学习如何设置问题格式对您有好处。在编写代码时,您可以使用输入文本框上方的“?”按钮调出有关格式化内容的所有方面的帮助。您可以发布您测试代码所依据的内容以及您得到的回报吗?您为什么要尝试“不使用左/右方式”进行测试?您是否意识到这种方法的效率明显降低?(我并不是说这一定真的很重要,只是好奇为什么这会是您的首选,以及您是否至少意识到效率低下。)此外,正如我在另一篇评论中指出的,您的排序方法不会为未排序的数组返回正确的结果。试试:
最近的大点([1,2,0],2)
我不明白这个问题。有人能解释一下这个问题是什么吗?A是有道理的。B没有那么多。起初,我以为它是在试图找到数组中比idx大的最近的数字,但考虑到第二次rspec测试,其中2应该产生1.对于大小为0、1和2的小数组,这将失败。如果索引为0且array.length为-1@mbj:最初只有当
idx
完全位于阵列之外时,它才会失败。我为那个案子加了一张支票。但是,对于其他场景(加载
irb
并尝试一下),您是错的。def nearest_-bigher(arr,idx)greater_-nums=[]arr.each{element | morerar_-nums arr[idx]}sorted_-bigher_-nums=greater_-nums.sort nearest_-bigher=sorted_-bigher=sorted_-bigher[0]答案=arr.index(nearr_-bigher)提出答案end@user2391263:如果数组未排序,则这将不起作用。在这个输入上尝试:
最近的\u更大([1,2,0],2)
。它将输出
0
,即使索引1处的元素仍然更大、更近。嘿,对了。我误解了这个问题:(。出于某种原因,我认为它想要最接近它的号码。非常感谢你的输入
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