以下是解决以下问题的代码:
编写一个函数nearest_larger(arr, i)
,它接受一个数组和一个
指数。该函数应返回另一个索引j
:这应该
满足:
(a)arr[i] < arr[j]
,AND
(b)j2
与i
之间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}}
有人可以告诉我我的代码与实际答案有何不同,对我而言,它似乎应该表现得完全相同,但我必须错过一些语法或忽略了一条逻辑。我需要另一双眼睛,因为我无法看到差异,谢谢!
答案 0 :(得分:2)
您的版本使用数组索引,然后才能检查它们是否在入境之内,即&&
的左侧。工作版本首先检查入境,然后使用索引,如果它是合法的。由于Ruby &&
短路,test && use
方法避免了您在实施过程中遇到的问题。
答案 1 :(得分:0)
解决方案中的第8行代码比较首先检查数组边界之前的数组中的值。注意正确的解决方案是以相反的顺序进行那些比较,并且&amp;&amp; amp;操作员短路,避免第二次(无效)比较。