0

我有整数,即9, 5, 4, 3, 1, 6, 7, 8. 我想返回存在三个降序或升序整数序列的索引。在上面的示例中,我会得到索引15. 这个的红宝石代码是什么?

def seq
  array = [9,5,4,3,1,6,7,8]
  array.each_with_index |val, index| 
    if (val < (array[index + 1]).val < (array[index + 1]).val) 
     puts "#{index}"
     # Skip two indexes 
    end
end
4

3 回答 3

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]
于 2013-08-07T21:04:07.933 回答
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
于 2013-08-07T21:04:22.353 回答
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)
于 2013-08-07T21:07:23.773 回答