【问题标题】:Sorting an array by corresponding ranges按相应范围对数组进行排序
【发布时间】:2017-10-30 17:31:41
【问题描述】:

我的目的是从list 填充一个数组:

list = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 12, 13, 15]

按以下顺序:

  • 不跟随其递增值(1)的单个整数将直接添加到结果数组中。
  • 后跟其递增值(1)的整数将被添加到范围数组中,然后该数组将添加到结果中,并将再次重置以用于下一个范围。

正确的输出应该是:

solution(list)
# => [-6, [-3, -2, -1, 0, 1], [3, 4, 5], [7, 8, 9, 10], [12, 13], 15]  

我的代码和我的输出如下。

def solution(list)
  result = []
  idx = 0
  loop do
    range = []
    loop do
      if list[idx+1] - list[idx] == 1
        range << list[idx]
        idx += 1
      else
        result << list[idx]
        idx += 1
        break
      end
    end
    result << range
  break if idx == list.size - 1
  end
  result
end 

solution(list)
# => [-6, [], 1, [-3, -2, -1, 0], 5, [3, 4], 10, [7, 8, 9], 13, [12]]

代码不正确。你能告诉我我错过了什么吗?

【问题讨论】:

  • 您的代码完全损坏了...我不会费心单步调试它;我只是重写它。
  • 另外,我知道这是一个算法挑战,但在“正常情况下”你可以使用 ruby​​ 广泛表达的语言 - 例如list.slice_when { |prev, curr| curr != prev.next }.to_a
  • 提示:尝试使用各种不同的输入来测试您的方法。尝试给它一个空数组,或者一个包含 1 个元素的数组,或者一个所有元素都是连续的数组,或者没有一个元素是连续的,...。使用涵盖更多边缘情况的各种输入来调试问题要容易得多。
  • 这是我第一次实际遇到 slice_when 方法,它似乎非常适合这种排序。我试图以迭代的方式解决它,但没有奏效。感谢这个简短的方法。
  • 我仍然强烈建议你尝试“手动”实现这个,如果这是练习的全部重点...... Ruby 丰富的库使编写简洁的代码变得非常容易,但我在感觉这是一个算法挑战。

标签: arrays ruby algorithm


【解决方案1】:

你错过了chunk_while

list.chunk_while{|a, b| a.next == b}.map{|a| a.one? ? a.first : a}
# => [-6, [-3, -2, -1, 0, 1], [3, 4, 5], [7, 8, 9, 10], [12, 13], 15]

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 2021-10-18
    相关资源
    最近更新 更多