我正在为我想要的课程做一些准备。他们作为实践提出的一个问题如下:
编写一个函数nearest_larger(arr, i)
,它接受一个数组和一个
指数。该函数应返回另一个索引j
:这应该
满足:
(a)arr[i] < arr[j]
,AND
(b)j2
与i
之间j
的距离不比arr[i] < arr[j]
更接近arr
。
如果是关系(参见下面的示例),请选择最早(最左侧)
这两个指数。如果arr[i]
中的号码不大于nil
,
返回def function(arr,i)
k = arr.length
puts "nil" if arr.all? {|number| arr[i] >= number}
(0..(arr.length-1)).to_a.each do |j|
if arr[j] > arr[i]
k = j if((i-j).abs < k) ##
end
end
puts k
end
。
所以我写的代码是:
function([1,2,6,5,10],3)
当{{1}}应返回2时,此{{1}}返回。
当遇到平局时,我无法解决问题。我以为我设计了我的代码来执行此操作(我将##放在我认为已解决的位置。)因为如果距离严格小于此值,它应该将索引分配给k我不知道它为什么会返回右边。我希望这是有道理的。任何帮助表示赞赏。
答案 0 :(得分:0)
k = arr.length
您已将k
默认为数组的长度,但这是您的返回值。最好使它像nil
那样,所以它不会混淆问题。我认为这就是你的回报价值4
的来源。如果在数组上添加一个新值,它将打印5,即数组的新长度。
puts "nil" if arr.all? {|number| arr[i] >= number}
当你使用all?
执行'是否有任何超过我的索引值'的值'时,你没有返回,所以方法将继续,并打印数组的长度(见上文)。
(0..(arr.length-1)).to_a.each do |j|
Enumerable(因此Array)有一个each_with_index
方法,因此您无需在循环前面指定/计算索引。您无需转换范围(0..x)
to_a
来循环它。
k = j if((i-j).abs < k) ##
你要比较j与k本身的距离,而不是k的距离。
您可以在阵列的单个循环中覆盖两个测试。通过<
测试,平局中最左边的答案会根据您对阵列的顺序来处理。
def find_closest_larger_index values, test_index, found = nil
values.each_with_index do |value,j|
found = j if value > values[test_index] and ( found.nil? or (test_index - j).abs < (test_index - found).abs )
end
found
end
给你
> find_closest_larger_index [1,2,6,5,10], 0
=> 1
> find_closest_larger_index [1,2,6,5,10], 1
=> 2
> find_closest_larger_index [1,2,6,5,10], 2
=> 4
> find_closest_larger_index [1,2,6,5,10], 3
=> 2
> find_closest_larger_index [1,2,6,5,10], 4
=> nil
答案 1 :(得分:0)
从您当前的代码:
def function(arr,i)
k = i - arr.length # the first result of (i-k).abs should be array length.
# returns -1 for testability purposes for `puts`
# this should be changed to return `nil`
return -1 if arr.all? {|number| arr[i] >= number}
(0...arr.length).to_a.each do |j|
if arr[j] > arr[i]
# since k is an index you should compare distance between i and j
# against the distance between i and k
k = j if((i-j).abs < (i-k).abs)
end
end
k
end
puts function([1,2,6,5,10], 0)
puts function([1,2,6,5,10], 1)
puts function([1,2,6,5,10], 2)
puts function([1,2,6,5,10], 3)
puts function([1,2,6,5,10], 4)
输出:
1
2
4
2
-1