给定整数如何找到三个asc和desc序列?

时间:2013-08-07 20:23:43

标签: ruby

我有整数,即9543167,{ {1}}。我想返回索引,其中存在三个降序或升序整数的序列。在上面的示例中,我将获得索引81。什么是红宝石代码?

5

3 个答案:

答案 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)