獲得數組裡的數字連號問題

來源:互聯網
上載者:User
$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?

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.