添加到数组连续数字

时间:2010-11-15 22:36:03

标签: php arrays algorithm

这是我的第一个问题,我希望能够做到。在PHP中(如果你不能,python或伪语言也可以),给定一个n元素的数组:

old_array = [1, 2, 3, 5, 7, 8, 9, 20, 21, 23, 29]

我需要添加一个新的数组连续数字,如果它不是一个连续数字,只将该值添加到一个新数组:

new_array = [ [1,2,3],
              [5],
              [7,8,9]
              [20,21]
              [23],
              [29]
            ]

在SO上,我找到了这些相关的主题,但无法让它发挥作用。

  1. Creating a list of lists with consecutive numbers
  2. Python finding n consecutive numbers in a list
  3. Find the sum of consecutive whole numbers w/o using loop in JavaScript

  4. 无效的代码在版本历史记录中,我将其删除,因为它存在格式问题。

    感谢所有人,特别是Juan,mistabell和Axsuul提供了正确答案。

3 个答案:

答案 0 :(得分:4)

我能想到的最好的是:

function subsequenceArray($values) {
    $res = array();
    $length = count($values);
    if (0 == $length) {
        return $res;
    }
    $last = 0;
    $res[$last] = array($values[0]);
    for ($i = 1; $i < $length; $i++) {
        if ($values[$i] == $values[$i-1] + 1) {
            $res[$last][] = $values[$i];
        } else {
            $res[++$last] = array($values[$i]);
        }
    }
    return $res;
}

答案 1 :(得分:1)

试试这个

function buildPairedArray($oldArray) {
$newArray = array();
$i = 0;

foreach ($oldArray as $index => $value) {
    if ($index == 0) {
        $newArray[$i][] = $value;
        continue;

    }

    if ($oldArray[$index] == $oldArray[$index-1]+1) { // consecutive
        $newArray[$i][] = $value;

    } else {
        $newArray[++$i][] = $value;

    }
}

return $newArray;

}

测试

$old = array(1, 2, 3, 5, 7, 8, 9, 20, 21, 23, 29);
print_r(buildPairedArray($old));

结果:

阵 (     [0] =&gt;排列         (             [0] =&gt; 1             [1] =&gt; 2             [2] =&gt; 3         )

[1] => Array
    (
        [0] => 5
    )

[2] => Array
    (
        [0] => 7
        [1] => 8
        [2] => 9
    )

[3] => Array
    (
        [0] => 20
        [1] => 21
    )

[4] => Array
    (
        [0] => 23
    )

[5] => Array
    (
        [0] => 29
    )

答案 2 :(得分:0)

同意,对我来说感觉像是一个标准的算法设计问题。 Eagleal,您是否尝试过使用伪代码进行思考,然后将其转换为PHP?如果两个给定的数字是连续的,你会如何在数学上(在你脑中)说出来?提示:答案涉及减法,甚至是加法,数字为1。