【问题标题】:Find the longest run of sequential integers in a vector在向量中查找最长的连续整数
【发布时间】:2012-07-11 13:09:04
【问题描述】:

我有一个将整数列表作为向量返回的例程。

这些整数来自连续数字组;例如,它可能看起来像这样:

vector = 6 7 8 12 13 14 15 26 27 28 29 30 55 56

请注意,上面有四组数字(6-8、12-15、26-30 和 55-56)。我想做的是将最长“运行”的数字转发到一个新向量。在这种情况下,这将是 26-30 的运行,所以我想制作:

newVector = 26 27 28 29 30

这个计算必须在各种向量上执行很多次,所以我越高效越好!任何智慧都将不胜感激。

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    你可以试试这个:

    v = [ 6 7 8 12 13 14 15 26 27 28 29 30 55 56];
    
    x = [0 cumsum(diff(v)~=1)];
    
    v(x==mode(x))
    

    这会导致

    ans =
    
        26    27    28    29    30
    

    【讨论】:

    • 我想我只是有一个书呆子
    【解决方案2】:

    这是一个让球滚动的解决方案。 . .

    vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56]
    d = [diff(vector) 0]
    
    
    maxSequence = 0;
    maxSequenceIdx = 0;
    lastIdx = 1;
    
    while lastIdx~=find(d~=1, 1, 'last')
    
        idx = find(d~=1, 1);
        if idx-lastIdx > maxSequence
            maxSequence = idx-lastIdx;
            maxSequenceIdx = lastIdx;
        end
    
        d(idx) = 1;
    
        lastIdx=idx;
    end
    
    output = vector(1+maxSequenceIdx:maxSequenceIdx+maxSequence)
    

    在本例中,diff 命令用于查找连续数字。当数字连续时,差为1。然后使用while循环找到最长的一组,并存储该连续组的索引。不过,我相信这可以进一步优化。

    【讨论】:

      【解决方案3】:

      没有循环使用diff:

      vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56];
      
      seqGroups = [1 find([1 diff(vector)]~=1) numel(vector)+1]; % beginning of group
      [~, groupIdx] = max( diff(seqGroups));                     % bigger group index
      
      output = vector( seqGroups(groupIdx):seqGroups(groupIdx+1)-1)
      

      输出向量是

      ans = 
      
          26    27    28    29    30
      

      【讨论】:

        【解决方案4】:

        没有循环 - 应该更快

        temp = find ( ([(vector(2:end) - vector(1:end-1))==1 0])==0);
        [len,ind]=max(temp(2:end)-temp(1:end-1));
        vec_out =  vector(temp(ind)+1:temp(ind)+len)
        

        【讨论】:

        • 你搞错了。 vector = [1 3 4 5]; 失败
        • 谢谢,当序列位于向量末尾时失败。固定。
        猜你喜欢
        • 2021-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多