有一个数组,如:array(103,109,35,66,2,3,58,37,99,38,101,102,36);求出其中连续值的最大长度,该数组中最大长度的连续值为(35,36,37,38)所以长度是4,请问该怎么写?

解决方案 »

  1.   


    <?php
    $a = array(103,109,35,66,2,3,58,37,99,38,101,102,36);
    $b[] = $a[0];
    $maxlen = 1;
    for($i = 1;$i<count($a);$i++)
    {

    if(in_array(($a[$i]-1),$b))
    {
    $b[] = $a[$i];
    if(count($b)>$maxlen)
    {
    $maxlen = count($b);
    }

    }
    else 
    {
    $b = array();
    $b[] = $a[$i];
    }

    }
    echo 'max successive length:'.$maxlen;
    ?>
      

  2.   

    不好意思,刚才把需求理解错了,做如下修改即可:<?php
    $a = array(103,109,35,66,2,3,58,37,99,38,101,102,36);
    sort($a);
    $b[] = $a[0];
    $maxlen = 1;
    for($i = 1;$i<count($a);$i++)
    {

    if(in_array(($a[$i]-1),$b))
    {
    $b[] = $a[$i];
    if(count($b)>$maxlen)
    {
    $maxlen = count($b);
    }

    }
    else 
    {
    $b = array();
    $b[] = $a[$i];
    }

    }
    echo 'max successive number length:'.$maxlen;
    ?>
      

  3.   

    算法是:
    1. 从小到大排序
    2. 转换成对应的字符串,每个数用加好(+)表示,不连续的地方插入一个减号(-)
    3. 用减号(-)对字符串进行分割,得到的子串分别计算出长度
    4. 对长度值的数组进行从大到小的排序,取第一个值代码如下:
    $a = array(103,109,35,66,2,3,58,37,99,38,101,102,36);
    sort( $a );
    $last = $a[0] - 1;
    $str = '';
    foreach ( $a as $v ) {
        $str .= ( $v != $last + 1 ) ? '-+' : '+';
        $last = $v;
    }
    $b = array_map( strlen, explode( '-', $str ) );
    rsort( $b );
    echo $b[0];■□■□■□■□■□■□■□■
    □             □
    ■  忍以明志 勤以致远  ■
    □             □
    ■□■□■□■□■□■□■□■
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)