【问题标题】:Group list elements by difference按差异对列表元素进行分组
【发布时间】:2018-10-05 10:44:51
【问题描述】:

假设我有一个列表,

(1,2,4,6,7,8,10,23,34,35,67,69,70)

如何将列表中差值为 1 或更少的元素组合在一起,输出如下所示,

((1,2),(4),(6,7,8),(10),(23),(34,35),(67),(69,70))

我尝试提出一些迭代解决方案,但每次都失败了,因为如果我们在迭代期间删除元素,列表的状态就会改变。无论如何,我认为我真的被卡住了,无法靠我自己解决这个问题。任何帮助表示赞赏。

任何编程语言都适用于解决方案,我所寻找的只是一个前进的方向。我不想要完整的解决方案。只是一些不完整的伪代码可以帮助我更快地解决这个问题,因为这是我正在尝试做的非常小的一部分。只是一个算法的名称也可以。 :)

【问题讨论】:

    标签: algorithm list grouping


    【解决方案1】:

    Java 不是 Ruby,但希望它相当容易翻译:

    int[] arr = {1,2,4,6,7,8,10,23,34,35,67,69,70};
    
    for(int i=1, j=0; i<=arr.length; i++)
    {
      if(i == arr.length || arr[i]-1 != arr[i-1])
      {
        System.out.printf("%s ", Arrays.toString(Arrays.copyOfRange(arr, j, i)));
        j = i;
      }
    }
    

    输出:

    [1, 2] [4] [6, 7, 8] [10] [23] [34, 35] [67] [69, 70] 
    

    【讨论】:

      【解决方案2】:

      好的,我想我解决了。但在我看来仍然很丑。我用过 Ruby,

      array = [1,2,4,6,7,8,10,23,34,35,67,69,70]
      
      last_index_before = array.size - 1
      arr = []
      
      # Can not use map because of the break maybe?
      (0..last_index_before).each do |_|
        element = array.delete_at(0)
        break if element.nil? # We reached the end
        results = [element]
      
        next_element = array[0]
        while !next_element.nil? && (next_element - element) <= 1
          results << array.delete_at(0)
          element = next_element
          next_element = array[0]
        end
        arr << results
      end
      
      p arr
      

      输出,

      [[1, 2], [4], [6, 7, 8], [10], [23], [34, 35], [67], [69, 70]]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 1970-01-01
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多