获得数组里的数字连号问题
'1,3,5,6,7,8,9,10,14,15,18,100,101',
'1,2,5,6,7,8,9,10,14,15,18,100,101,102'
);
求一个函数能计算数字元素包含连号的类型与次数
例如:第一组: 6连号1组,2连号2组
第一组: 6连号1组,2连号2组,3连号1组
我目前程序只能做到 1,2,5,6,7,8,9,10, 认为这是2连号6组!想了好久
回复讨论(解决方案)
放到数据库里,用自连接轻松搞定
楼上倒是给语句方案啊
放到数据库里,用自连接轻松搞定
没懂啊。有范例给我看下吗?
mysql_connect();mysql_select_db('test');mysql_query('DROP TABLE IF EXISTS lookup');mysql_query('CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY');$a = array(1,3,5,6,7,8,9,10,14,15,18,100,101);foreach($a as $v) mysql_query("insert into lookup values ($v)");for($n=2; $n$n"; $rs = mysql_query("select a.id, group_concat(b.id) as grouping, count(*) as cnt from lookup a, lookup b where a.idb.id-$n group by a.id HAVING cnt=$n") or die(mysql_error()); while($row = mysql_fetch_assoc($rs)) { echo $row['grouping'], '
'; }}
function LinkNum($array,$num){ if(count($array) ';echo "1,3,5,6,7,8,9,10,14,15,18,100,101".'有3连号'.LinkNum(array(1,3,5,6,7,8,9,10,14,15,18,100,101),3).'组'.'
';echo "1,3,5,6,7,8,9,10,14,15,18,100,101".'有4连号'.LinkNum(array(1,3,5,6,7,8,9,10,14,15,18,100,101),4).'组'.'
';
1,3,5,6,7,8,9,10,14,15,18,100,101有2连号2组
1,3,5,6,7,8,9,10,14,15,18,100,101有3连号0组
1,3,5,6,7,8,9,10,14,15,18,100,101有4连号0组
我也写出来了,不过效率不咋地,遍历几十万次数组要好几分钟!
可能我没说清楚,这才是我想要的,2连号只能出现两个相邻的,其他不算;
就看有无高手可以优化下,我用笨方法这样试出来的!优化的朋友贴上代码我会追加分数
1,3,5,6,7,8,9,10,14,15,18,100,101有2连号2组 ?
1,3, 5,6, 7,8, 9,10, 14,15,18, 100,101有2连号2组
不是 5 组吗?
还没有算 8,9
1,3,5,6,7,8,9,10,14,15,18,100,101有2连号2组 ?
1,3, 5,6, 7,8, 9,10, 14,15,18, 100,101有2连号2组
不是 5 组吗?
5,6,7,8,9,10是6连号,不算2连,只有14,15,与100,101算2连
嗯,不计及连续数子集
$a = array(1,3,5,6,7,8,9,10,14,15,18,100,101);print_r(consecutive_numbers($a));echo consecutive_numbers($a, 4);function consecutive_numbers($ar,$num=0) { $res = array(); for($i=0; $i1) { $res[$j-$i][] = join(",", array_slice($ar, $i, $j-$i)); $i = --$j; } } if($num) return count(@$ret[$num]); return $res;}
Array( [6] => Array ( [0] => 5,6,7,8,9,10 ) [2] => Array ( [0] => 14,15 [1] => 100,101 ))0
嗯,不计及连续数子集
$a = array(1,3,5,6,7,8,9,10,14,15,18,100,101);print_r(consecutive_numbers($a));echo consecutive_numbers($a, 4);function consecutive_numbers($ar,$num=0) { $res = array(); for($i=0; $i1) { $res[$j-$i][] = join(",", array_slice($ar, $i, $j-$i)); $i = --$j; } } if($num) return count(@$ret[$num]); return $res;}
Array( [6] => Array ( [0] => 5,6,7,8,9,10 ) [2] => Array ( [0] => 14,15 [1] => 100,101 ))0
最后那个@$ret 是什么意思,好像没定义这个变量,是不是写错了
$ret 是数组,前面已经有定义($ret = array(); )
直接 $ret[$num] 可能引发 E_NOTICE 级别错误($ret[$num] 可能不存在,比如 $ret[4])
加个 @ 就可屏蔽掉错误信息
或者你改作 return count(isst($ret[$num] ? $ret[$num] : array());
$ret 是数组,前面已经有定义($ret = array(); )
直接 $ret[$num] 可能引发 E_NOTICE 级别错误($ret[$num] 可能不存在,比如 $ret[4])
加个 @ 就可屏蔽掉错误信息
或者你改作 return count(isst($ret[$num] ? $ret[$num] : array());
$res = array(); 定义的是这个吧!我拷贝到IDE里,查找都没找到
怎么最后就变成$ret了,第一感觉肯定是写错了
你那是什么 IDE?
推荐阅读