遇到这样一个问题,请几大家给个比较好的算法,提供一个思路,有这样一个字符串
0111010110111
这个字符一共有13为,刚好第2,3,4,6,8,9,11,12,13位是1,则需要返回
2-4,6,8,9,11-13
也就是如果连续三位或者三位以上是1,则返回该位置连续1的位置
如果三个以下则直接返回该1出现的位置0111010110111
----->2-4,5,8,9,11-13

解决方案 »

  1.   


    $str = '0111010110111';
    $res = array();
    $temp = preg_split('/([1]+)/', $str, -1, PREG_SPLIT_OFFSET_CAPTURE);
    foreach($temp AS $k=>$v)
    {
    if(isset($temp[$k+1]))
    {
    $res[] = $temp[$k+1][1] == $v[1]+2 ? $temp[$k+1][1] : (($v[1]+2) . '-' . $temp[$k+1][1]);
    }
    }
    print_r($res);Array
    (
        [0] => 2-4
        [1] => 6
        [2] => 8-9
        [3] => 11-13
    )
      

  2.   

    不对,例如这样一个字符将错误
    01111001000001100000
    应该返回2-5,8,14,15
    程序返回
    Array ( [0] => 2-5 [1] => 7-8 [2] => 10-15)