循环数组以获得最接近的较大整数

时间:2014-05-02 23:30:53

标签: ruby arrays loops

以下是解决以下问题的代码:

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

(a)arr[i] < arr[j],AND (b)j2i之间j的距离不比arr[i] < arr[j]更接近arr

如果是领带,请选择最早(最左侧) 这两个指数。如果arr[i]中的号码不大于nil, 返回def nearest_larger(arr, i) k = 1 loop do jleft = i - k jright = i + k if (arr[i] < arr[jleft]) && (jleft >= 0) return jleft elsif (arr[i] < arr[jright]) && (jright < arr.length) return jright elsif (jleft < 0) && (jright >= arr.length) return nil end k += 1 end end

这是我的尝试:

def nearest_larger(arr, idx)
  diff = 1
  loop do
    left = idx - diff
    right = idx + diff

    if (left >= 0) && (arr[left] > arr[idx])
      return left
    elsif (right < arr.length) && (arr[right] > arr[idx])
      return right
    elsif (left < 0) && (right >= arr.length)
      return nil
    end

    diff += 1
  end
end

这是实际的正确答案

x = [1,6,9,4,5]
puts nealest_larger(x, 4)

虽然我的代码适用于我使用某些组合时测试的许多值:

calc.rb:8:in `<': comparison of Fixnum with nil failed (ArgumentError)
        from calc.rb:8:in `block in nealest_larger'
        from calc.rb:3:in `loop'
        from calc.rb:3:in `nealest_larger'
        from calc.rb:40:in `<main>'

我收到此错误

{{1}}

有人可以告诉我我的代码与实际答案有何不同,对我而言,它似乎应该表现得完全相同,但我必须错过一些语法或忽略了一条逻辑。我需要另一双眼睛,因为我无法看到差异,谢谢!

2 个答案:

答案 0 :(得分:2)

您的版本使用数组索引,然后才能检查它们是否在入境之内,即&&的左侧。工作版本首先检查入境,然后使用索引,如果它是合法的。由于Ruby &&短路,test && use方法避免了您在实施过程中遇到的问题。

答案 1 :(得分:0)

解决方案中的第8行代码比较首先检查数组边界之前的数组中的值。注意正确的解决方案是以相反的顺序进行那些比较,并且&amp;&amp; amp;操作员短路,避免第二次(无效)比较。