ホームページ > バックエンド開発 > PHPチュートリアル > 配列内の連続する数値を取得する問題

配列内の連続する数値を取得する問題

WBOY
リリース: 2016-06-20 12:42:41
オリジナル
1335 人が閲覧しました

$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 にはグループ 0
1,3,5,6,7,8,9,10 に 3 つの連続する数字があります, 14, 15, 18, 100, 101は連続する数字が4つでグループが0です

私も書きましたが、数十万のグループを横断するには数分かかります。
私が明確にしていないかもしれませんが、これが私が望んでいることです。2 つの連続する数字は隣接する 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<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 は以前に定義されています ($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());


$res = array() に変更することもできます; これが定義されているものです! IDE にコピーしましたが、結局 $ret になったのはなぜですか?
というのが私の第一印象です。あなたのIDEは


ですか?

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート