【问题标题】:Looping in an array to attain nearest larger integer在数组中循环以获得最接近的较大整数
【发布时间】:2014-05-02 23:30:52
【问题描述】:

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

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

(a)arr[i] < arr[j],并且 (b) 没有比j 更接近ij2,其中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>'

谁能告诉我我的代码与实际答案有何不同,在我看来它的行为应该完全相同,但我一定错过了一些语法或忽略了一段逻辑。我需要另一双眼睛,因为我看不出有什么不同,谢谢!

【问题讨论】:

  • j2 与条件 (b) 有何关系?
  • 我不明白你的问题

标签: ruby arrays loops


【解决方案1】:

您的版本在您检查它们是否在边界内之前使用数组索引,即在&amp;&amp; 的左侧。工作版本首先检查入界,然后使用合法的索引。因为 Ruby &amp;&amp; 短路,test &amp;&amp; use 方法避免了您在实现中遇到的问题。

【讨论】:

    【解决方案2】:

    解决方案中的第 8 行代码比较数组中的值之前首先检查数组的边界。请注意,正确的解决方案以相反的顺序进行这些比较,并且 && 运算符短路,避免了第二次(无效)比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多