遇到这样一个问题,请几大家给个比较好的算法,提供一个思路,有这样一个字符串
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
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
$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
)
01111001000001100000
应该返回2-5,8,14,15
程序返回
Array ( [0] => 2-5 [1] => 7-8 [2] => 10-15)