$result = array(
'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<5; $n++) { echo "$n
"; $rs = mysql_query("select a.id, group_concat(b.id) as grouping, count(*) as cnt from lookup a, lookup b where a.id<=b.id and a.id>b.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) < $num) { return 0; } $cishu = 0; //臨時變數 $total = 0; //N連號次數 for($i=0;$i';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; $i 1) { $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; $i 1) { $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?