我有整数,即9
,5
,4
,3
,1
,6
,7
,{ {1}}。我想返回索引,其中存在三个降序或升序整数的序列。在上面的示例中,我将获得索引8
和1
。什么是红宝石代码?
5
答案 0 :(得分:0)
由于问题不够明确。我将假设问题是找到3个递增或递减的连续数字。如果满足序列的长度超过3,例如[2,3,4,5],则返回0和1.
这是算法,对所有元素执行list[index] - list[index - 1]
,并再次重复它,答案将是计算后的0个元素的索引。
直观地,
original 9, 5, 4, 3, 1, 6, 7, 8
first pass -4, -1, -1, -2, 5, 1, 1
2nd pass 3, 0, -1, 7, 4, 0 -> the answer will be the indexes of 0's, which is 1, 5
算法:
lst = [9, 5, 4, 3, 1, 6, 7, 8]
lst1 = lst.each_cons(2).map{ |a, b| b-a }
lst2 = lst1.each_cons(2).map{ |a, b| b-a }
result = lst2.each_index.select{|i| lst2[i] == 0}
result = [1, 5]
答案 1 :(得分:0)
我认为你的解决方案背后的逻辑几乎是正确的,但你的语法与有效的Ruby相差甚远。
以下是一对非常详细的解决方案(希望)相当明显:
numbers = [9, 6, 5, 4, 3, 1, 6, 7, 8]
# Find non-overlapping sets
i = 0
until i > numbers.length - 2
a, b, c = numbers[i..i + 2]
if (a - b == b - c) && (a - b).abs == 1
puts "#{i} (#{a},#{b},#{c})"
# Skip next two indexes
i += 3
else
i += 1
end
end
# Find overlapping sets (same solution, but don't skip indexes)
(0...numbers.length - 2).each do |i|
a, b, c = numbers[i..i + 2]
if (a - b == b - c) && (a - b).abs == 1
puts "#{i} (#{a},#{b},#{c})"
end
end
答案 2 :(得分:0)
以下是使用each_cons(3).with_index
的解决方案:
[9,5,4,3,1,6,7,8].each_cons(3).with_index.select { |s, i| s[0] < s[1] && s[1] < s[2] }.map(&:last)