Ruby 计算数组中连续整数元素的数目

Ruby 计算数组中连续整数元素的数目,ruby,arrays,performance,algorithm,Ruby,Arrays,Performance,Algorithm,假设我有一个数组,如下所示: arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4] 我想数一数连续的数字序列。例如,在上述数组中,连续数字序列(或数组切片)为: 因此我们有3个这样的切片。什么是一个有效的算法来计算?我知道怎样才能做到这一点,但我正在寻找比这更好的方法。我认为这可以在O(N)时间内完成。如果你只想数一数 遍历数组。将计数器初始化为0 如果下一个元素比当前元素多一个或少一个,则递增计数器 继续迭代,直到下一个元素不比当前元

假设我有一个数组,如下所示:

arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
我想数一数连续的数字序列。例如,在上述数组中,连续数字序列(或数组切片)为:


因此我们有3个这样的切片。什么是一个有效的算法来计算?我知道怎样才能做到这一点,但我正在寻找比这更好的方法。

我认为这可以在O(N)时间内完成。如果你只想数一数

  • 遍历数组。将计数器初始化为0
  • 如果下一个元素比当前元素多一个或少一个,则递增计数器
  • 继续迭代,直到下一个元素不比当前元素多或少
  • 重复步骤2和3,直到到达终点 如果您想要连续增加连续元素的部分(您的问题不清楚)

  • 遍历数组。将计数器初始化为0
  • 如果下一个元素比当前元素多一个,则递增计数器
  • 继续迭代,直到下一个元素不比当前元素多出一个
  • 重复步骤2和3,直到到达终点
  • nil
    chunk
    -方法有一个特殊的意义:它导致项目被删除

    arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
    result = []
    stage = []
    for i in arr:
        if len(stage) > 0 and i != stage[-1]+1:
            if len(stage) > 1:
                result.append(stage)
            stage = []
        stage.append(i)
    print result
    

    输出:

        [[13, 14], [6, 7, 8], [6, 7]] 
    
    此代码的时间复杂度为O(n)。(对于循环只有一个
    。不难看出循环中的每个迭代都是O(1)。

    我将使用以下方法:


    我认为[6,7,8]不是一对。您正在查找所有连续序列吗?抱歉-是连续序列。编辑问题。为什么[7,8]不是一个有效的对?@Skyler,因为[6,7,8]在那里形成了连续序列……但是[6,7]是有效的,尽管它也是[6,7,8]的子序列?我看不出有什么区别。在#2上,如果
    下一个元素比当前元素少一个,则它将不起作用。我认为你的意思是<代码>如果当前元素比下一个元素或下一个元素1要比当前元素>JasDeSigh少,你不认为[1,2,1]是一个连续的序列吗?根据我对“<代码> [1,2,1] < /代码>中的连续数的理解,只有<代码> [1,2]
    是连续的。我想你刚才用Python回答了一个Ruby问题:)@JonClements这没关系-我只需要理解如何用O(N)实现这一点,我自己可以翻译成Ruby。这看起来不错:)@jasdepsingh只有一个
    循环。不难看出循环中的每个迭代都是O(1)。@JonClements抱歉,但我没有注意到这一点。谢谢:-如果len(stage)>1,则填充另一个:result.append(stage)在print语句之前可以使算法更完整。非常酷(+1)。作为奖励,它不会不必要地计算实际序列。是的,但不是直接形式的
    [6,7,8]
    。它是
    [[6,7],[7,8]]
    arr = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
    result = []
    stage = []
    for i in arr:
        if len(stage) > 0 and i != stage[-1]+1:
            if len(stage) > 1:
                result.append(stage)
            stage = []
        stage.append(i)
    print result
    
        [[13, 14], [6, 7, 8], [6, 7]] 
    
    a = [8, 13, 14, 10, 6, 7, 8, 14, 5, 3, 5, 2, 6, 7, 4]
    prev = a[0]
    hash = Hash[a.slice_before do |e|
      prev, prev2 = e, prev
      prev2 + 1 != e
    end.map{|e| [e,e.size] if e.size > 1}]
    hash # => {[13, 14]=>2, [6, 7, 8]=>3, [6, 7]=>2}
    hash.size # => 3