我在找到数组中的最大值后退出循环有一个问题。
任务是:
金字塔# 1让我们考虑一个长度为n的数组p,其中包含(1 ~ n)范围内的唯一数字-例如p=[1,3,4,2,5] (n=5)
每个数字代表金字塔的高度。假设,更低的金字塔放在更高的金字塔是不可见的确定有多少金字塔可见从一开始(左)和结束(右侧)给定的数组。{左:x,右:y}
示例1:输入:p = [1,2,3,4,5]
输出:{左:5,右:1}
解释:从左边我们可以看到所有的5座金字塔,而从右边我们只能看到最高的一座
示例2:输入:p = [4,5,1,2,3]
输出:{左:2,右:2}
说明:从左边我们可以看到4和5;右起:5和3
我代码:
array = [4,5,1,2,3]
left = 1
array.each_cons(2) do |first, second|
if first < second
left += 1
end
end
right = 1
array.reverse.each_cons(2) do |first, second|
if first < second
right += 1
end
end
puts hash = {left: left, right: right}
我需要在找到数组后打破循环。
你有什么想法吗?
我认为根本问题不在于退出循环,而在于正在执行的计算。
假设
p = [4,5,1,2,3,6,5]
这是观察者从左边看建筑物时所看到的图画
[4,5,1,2,3,6,5]
■
0 -> ■ ■ ■
| ■ ■ ■ ■
^ ■ ■ ■ ■ ■
| ■ ■ ■ ■ ■ ■
^ ■ ■ ■ ■ ■ ■ ■
左观0
、1
、5
偏移位置的建筑物(高度分别为4
、5
、6
)可见。从右边看,可以看到6
和5
偏移位置的建筑物(5
和6
的高度)。
注意,当且仅当建筑物比它和观察者之间的所有建筑物都高时,建筑物才可见。因此,我们可以计算出从左边看时可见的建筑物的数量,如下所示。
def visible_from_left(p)
mx = 0
p.count do |x|
tf = x > mx
mx = [mx, x].max
tf
end
end
visible_from_left(p)
#=> 3
看到数组#计数。
要确定从右侧可见的建筑物的数量,我们可以简单地使用visible_from_left
和p.reverse
作为参数。
def visible_from_right(p)
visible_from_left(p.reverse)
end
visible_from_right(p)
#=> 2