C中数组中最长的1的序列

时间:2011-05-12 15:02:03

标签: arrays count sequence

我有一个这样的数组:

0011011100011111001

我想在这个数组中找到最长的1的序列,记下起点的长度和位置,这里长度为5,起点为12。

关于如何解决此问题的任何想法?

3 个答案:

答案 0 :(得分:1)

我同意它看起来像家庭作业,但我这样做的方式是存储当前1次运行的开始和长度以及最长运行的开始和长度。遍历数组。每当从0更改为1时,更新当前开始位置并将长度设置为1.当长度超过最长时,更新最长和起点。这在输入的长度中以O(n)运行。这不包括边缘情况,例如没有1的数组。

答案 1 :(得分:1)

迭代数组,保持到目前为止找到的最大连续数的计数,以及当前连续数的单独计数。

let max_consec = 0
let curr_consec = 0
let i = 0
while i < array.size:
    if array[i] is 1:
        curr_consec++
    else:
        max_consec = Max(max_consec, curr_consec)
        curr_consec = 0
    i++

经过一番思考,你应该能够自己弄清楚如何跟踪起始位置。

答案 2 :(得分:0)

您可以将起始位置和长度最初设置为零,然后逐个遍历数组元素,使用简单的状态机跟踪10之间的转换。

状态表如下所示:

              +----------------------------------------+
              |               lastNum                  |
              +------------------+---------------------+
              |         0        |          1          |
+---------+---+------------------+---------------------+
|         | 0 | Just get next    | Check/update runLen |
|         |   |  character       |  against previous   |
| thisNum +---+------------------+---------------------+
|         | 1 | Store runPos  ,  | Increment runLen    |
|         |   |  set runLen to 0 |                     |
+---------+---+------------------+---------------------+

由于您只对1序列感兴趣,因此初始状态lastNum设置为零,以确保开始时1正确开始运行。我们还设置了初始的“迄今为止最大的运行”,其大小和位置为零,以确保它被第一次真实运行覆盖。

此方法有一个特殊的边缘情况,因为我们必须检测列表中的最终数字是否为1 - 如果是这样,则表示在结尾处没有1 -> 0转换用于检查1号码的最终运行的列表。

由于我们将在不检查最终运行的情况下退出循环,因此我们最终检查,就好像我们正在从1转换为0

伪代码就是这样的。首先,所有变量的初始化:

# Store the current maximum run of '1' characters (none) and initial state.

var maxLen = 0, maxPos = 0, lastNum = 0

# runLen and runPos will be set in a 0->1 transition before we use them.

var rnLen, runPos

然后我们可以简单地迭代列表中的每个数字,并按照上图检测转换:

# Iterate over entire list, one by one.

for curPos = 0 to len(list) - 1:
    # 0 -> 0: do nothing.

    # 0 -> 1: store position, set run length to 1.

    if lastNum == 0 and list[curPos] == 1:
        runPos = curPos
        runLen = 1
    endif

    # 1 -> 1: increment the current run length.

    if lastNum == 1 and list[curPos] == 1:
        runLen = runLen + 1
    endif

    # 1 -> 0: check current run against greatest to date.

    if lastNum == 1 and list[curPos] == 0:
        if runLen > maxLen:
            maxPos = runPos
            maxLen = runLen
        endif
    endif

    # Save current number into lastNum for next iteration.

    lastNum = list[curPos]
endfor

然后,最后,处理上述边缘情况:

# If we finished with a `1`, need to check final run.

if lastNum = 1:
    if runLen > maxLen:
        maxPos = runPos
        maxLen = runLen
    endif
endif