ホームページ >バックエンド開発 >PHPチュートリアル >配列内の連続する数値を取得する問題
$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'
);
デジタル要素内の連続する数字の種類と数を計算できる関数を見つけます
例: 最初のグループ: 1 つの中に 6 つの連続する数字グループ、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 "<h5>$n</h5>"; $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'], '<br>'; }}
function LinkNum($array,$num){ if(count($array) < $num) { return 0; } $cishu = 0; //临时变量 $total = 0; //N连号次数 for($i=0;$i<count($array);$i++) { if($array[$i] == $array[$i+1]-1) { $cishu++; if($cishu == $num) { $i = $i+1; $cishu = 0; } } else { if($cishu == $num -1 && ($i - $num <= 0 || $array[$i] - $num != $array[$i - $num])) { $total++; } $cishu = 0; } } return $total;}echo "1,3,5,6,7,8,9,10,14,15,18,100,101".'有2连号'.LinkNum(array(1,3,5,6,7,8,9,10,14,15,18,100,101),2).'组'.'<br>';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).'组'.'<br>';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).'组'.'<br>';
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 ではありませんグループ?
さて、連続する数値のサブセットはカウントされません
$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<count($ar)-1; $i++) { for($j=$i+1; isset($ar[$j]) && $ar[$j]-$ar[$i] == $j-$i; $j++); if($j-$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<count($ar)-1; $i++) { for($j=$i+1; isset($ar[$j]) && $ar[$j]-$ar[$i] == $j-$i; $j++); if($j-$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 = 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[4] など、$ ret[$num] が存在しない可能性があります)
@ を追加してブロックしますエラーメッセージ
または、 return count(isst($ret[$num] ? $ ret[$num] : array());
ですか?